{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "e05ceaa1-1ff0-42c5-90f6-cbcb94542c66",
   "metadata": {},
   "outputs": [],
   "source": [
    "import keras"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "8b426368-a189-4641-9243-c718c6614295",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'2.7.0'"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "keras.__version__"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b369371-07e8-46bd-8950-070fdb3136c9",
   "metadata": {},
   "source": [
    "# 准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "b769b130-55d0-4711-bcc2-499be17e4282",
   "metadata": {},
   "outputs": [],
   "source": [
    "fashion_mnist = keras.datasets.fashion_mnist\n",
    "(x_train_full, y_train_full), (x_test, y_test) = fashion_mnist.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "dfc1ac56-5cbd-4b38-a656-fab83010aa7a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(60000, 28, 28)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train_full.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1f017496-accd-40d9-8919-89a5c252419c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('uint8')"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train_full.dtype"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ba667c3f-546d-4d95-bea9-7ab7e6230dd7",
   "metadata": {},
   "source": [
    "## 划分验证集并缩放"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "12e67787-8980-4d05-9f07-044d4fa853bb",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "x_valid, x_train = x_train_full[:5000] / 255, x_train_full[5000:] / 255\n",
    "y_valid, y_train = y_train_full[:5000], y_train_full[5000:]\n",
    "x_test = x_test / 255"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "35495da5-a8c1-4590-8eb7-00532ab7c71c",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Snearker', 'Bag', 'Ankle boot']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "87cffc90-9e3d-4dd4-9407-069c06139703",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Coat'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "class_names[y_train[0]]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b5b1272b-a58c-468e-8ee8-07d5c7ffc73d",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 顺序API构建图像分类器"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "edf0af99-5a85-456a-a8e1-b09c29f86ba4",
   "metadata": {
    "tags": []
   },
   "source": [
    "## 基本结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "53b0c064-b76b-45f9-9ed0-61ce753ff282",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Flatten(input_shape=[28, 28]),  # 将输入图像转化为一维数组，如果是回归任务则不需要\n",
    "    keras.layers.Dense(300, activation='relu'),\n",
    "    keras.layers.Dense(100, activation='relu'),\n",
    "    keras.layers.Dense(10, activation='softmax')  # 输出层为10个神经元，代表10个类别，分类器输出层有激活函数，回归任务没有\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "dc787e6e-282a-4673-bbd5-b5204ce78fa0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_3\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " flatten (Flatten)           (None, 784)               0         \n",
      "                                                                 \n",
      " dense_4 (Dense)             (None, 300)               235500    \n",
      "                                                                 \n",
      " dense_5 (Dense)             (None, 100)               30100     \n",
      "                                                                 \n",
      " dense_6 (Dense)             (None, 10)                1010      \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 266,610\n",
      "Trainable params: 266,610\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "950c30ea-c7e9-4837-818b-e5e27a9611c0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<keras.layers.core.flatten.Flatten at 0x2b684565190>,\n",
       " <keras.layers.core.dense.Dense at 0x2b684565790>,\n",
       " <keras.layers.core.dense.Dense at 0x2b684565be0>,\n",
       " <keras.layers.core.dense.Dense at 0x2b69c7a4a60>]"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.layers  # 层列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "8c8ba2a3-3d21-495a-ad7d-28c9cf0689d8",
   "metadata": {},
   "outputs": [],
   "source": [
    "hidden1 = model.layers[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "613f9350-8bce-4e02-b2b6-133649e2f327",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<keras.layers.core.dense.Dense at 0x2b6f6ff6df0>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hidden1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "37a39794-66b1-4534-9e3d-7eb76825b05a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'dense'"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "hidden1.name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "a18025f6-8576-4215-a289-5a906023bac2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<keras.layers.core.dense.Dense at 0x2b6f6ff6df0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.get_layer('dense')  # 按名称获取层"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "cbdca0e1-c3e0-4468-a6e0-71c780d00887",
   "metadata": {},
   "outputs": [],
   "source": [
    "weights, biases = hidden1.get_weights()  # 获取权重参数和偏置项参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "cdc8e958-5ae2-4a2d-b539-cdeb30ec282b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.00968239,  0.03461326,  0.05846111, ..., -0.03392325,\n",
       "        -0.00664008, -0.01606906],\n",
       "       [-0.003957  ,  0.01952675, -0.04055088, ..., -0.04858923,\n",
       "         0.01837832, -0.02100547],\n",
       "       [-0.0414397 ,  0.03258554,  0.02129711, ..., -0.07195474,\n",
       "        -0.02195781,  0.03715862],\n",
       "       ...,\n",
       "       [-0.0004601 , -0.06397507,  0.0267387 , ...,  0.0555315 ,\n",
       "         0.02843712,  0.01336448],\n",
       "       [ 0.03069062,  0.05461755,  0.03150493, ..., -0.02510052,\n",
       "        -0.06976874,  0.00923341],\n",
       "       [ 0.02781585, -0.00072756, -0.0319463 , ..., -0.0254439 ,\n",
       "         0.0628563 ,  0.06016944]], dtype=float32)"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2bd652aa-9ec5-4a69-9ecf-576568f09c5b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(784, 300)"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "weights.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "71bef3f0-96e4-4ddb-9730-69413d1f86c9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "       0., 0., 0.], dtype=float32)"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "biases[:20]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "51560eb9-e140-4619-902c-1b2a0970bc27",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300,)"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "biases.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e91ad4e7-6de3-4d76-9ec0-473546334fb0",
   "metadata": {},
   "source": [
    "## 指定损失函数和优化器等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "926c0082-dc11-4ca1-9eac-b3baa5eaad83",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss='sparse_categorical_crossentropy',  # 也可以写 loss = keras.losses.sparse_categorical_crossentropy\n",
    "             optimizer='sgd',  # optimizer = keras.optimizers.SGD(lr=0.01)  可以指定学习率\n",
    "             metrics=['accuracy'])  # metrics = keras.metrics.sparse_categorical_accuracy, 在分类器训练评估中测量'accuracy'很有用"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3594cbb-5786-43d4-9b5b-84b539231caa",
   "metadata": {},
   "source": [
    "```python\n",
    "model.compile(loss=keras.losses.sparse_categorical_crossentropy,\n",
    "              optimizer=keras.optimizers.SGD(),\n",
    "              metrics=[keras.metrics.sparse_categorical_accuracy])\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a947177f-4a83-4a34-b6e8-20a87a242290",
   "metadata": {},
   "source": [
    "## 训练和评估"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "36f64f9b-2ea4-44a4-828b-1dbfce29b4a1",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/30\n",
      "1719/1719 [==============================] - 4s 1ms/step - loss: 0.7200 - accuracy: 0.7609 - val_loss: 0.5278 - val_accuracy: 0.8172\n",
      "Epoch 2/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4891 - accuracy: 0.8307 - val_loss: 0.4442 - val_accuracy: 0.8534\n",
      "Epoch 3/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4433 - accuracy: 0.8452 - val_loss: 0.4178 - val_accuracy: 0.8556\n",
      "Epoch 4/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.4160 - accuracy: 0.8546 - val_loss: 0.4003 - val_accuracy: 0.8620\n",
      "Epoch 5/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3956 - accuracy: 0.8609 - val_loss: 0.3793 - val_accuracy: 0.8684\n",
      "Epoch 6/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3789 - accuracy: 0.8654 - val_loss: 0.3852 - val_accuracy: 0.8630\n",
      "Epoch 7/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3657 - accuracy: 0.8708 - val_loss: 0.4080 - val_accuracy: 0.8554\n",
      "Epoch 8/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3554 - accuracy: 0.8739 - val_loss: 0.3681 - val_accuracy: 0.8710\n",
      "Epoch 9/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3433 - accuracy: 0.8797 - val_loss: 0.3678 - val_accuracy: 0.8674\n",
      "Epoch 10/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3346 - accuracy: 0.8804 - val_loss: 0.3411 - val_accuracy: 0.8756\n",
      "Epoch 11/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3263 - accuracy: 0.8847 - val_loss: 0.3404 - val_accuracy: 0.8798\n",
      "Epoch 12/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3176 - accuracy: 0.8870 - val_loss: 0.3478 - val_accuracy: 0.8776\n",
      "Epoch 13/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3104 - accuracy: 0.8885 - val_loss: 0.3252 - val_accuracy: 0.8832\n",
      "Epoch 14/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.3032 - accuracy: 0.8907 - val_loss: 0.3287 - val_accuracy: 0.8824\n",
      "Epoch 15/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2965 - accuracy: 0.8919 - val_loss: 0.3177 - val_accuracy: 0.8840\n",
      "Epoch 16/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2911 - accuracy: 0.8955 - val_loss: 0.3439 - val_accuracy: 0.8822\n",
      "Epoch 17/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2843 - accuracy: 0.8978 - val_loss: 0.3301 - val_accuracy: 0.8814\n",
      "Epoch 18/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2792 - accuracy: 0.8983 - val_loss: 0.3392 - val_accuracy: 0.8774\n",
      "Epoch 19/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2736 - accuracy: 0.9017 - val_loss: 0.3059 - val_accuracy: 0.8924\n",
      "Epoch 20/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2687 - accuracy: 0.9034 - val_loss: 0.3232 - val_accuracy: 0.8846\n",
      "Epoch 21/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2636 - accuracy: 0.9051 - val_loss: 0.3136 - val_accuracy: 0.8850\n",
      "Epoch 22/30\n",
      "1719/1719 [==============================] - 3s 2ms/step - loss: 0.2597 - accuracy: 0.9073 - val_loss: 0.2987 - val_accuracy: 0.8908\n",
      "Epoch 23/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2559 - accuracy: 0.9082 - val_loss: 0.2990 - val_accuracy: 0.8904\n",
      "Epoch 24/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2511 - accuracy: 0.9097 - val_loss: 0.2974 - val_accuracy: 0.8932\n",
      "Epoch 25/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2463 - accuracy: 0.9115 - val_loss: 0.3079 - val_accuracy: 0.8896\n",
      "Epoch 26/30\n",
      "1719/1719 [==============================] - 3s 1ms/step - loss: 0.2423 - accuracy: 0.9135 - val_loss: 0.2965 - val_accuracy: 0.8924\n",
      "Epoch 27/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2393 - accuracy: 0.9137 - val_loss: 0.2956 - val_accuracy: 0.8914\n",
      "Epoch 28/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2340 - accuracy: 0.9167 - val_loss: 0.2917 - val_accuracy: 0.8916\n",
      "Epoch 29/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2309 - accuracy: 0.9173 - val_loss: 0.3025 - val_accuracy: 0.8930\n",
      "Epoch 30/30\n",
      "1719/1719 [==============================] - 2s 1ms/step - loss: 0.2278 - accuracy: 0.9187 - val_loss: 0.2949 - val_accuracy: 0.8898\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train, y_train, epochs=30, validation_data=(x_valid, y_valid)) \n",
    "# validation_data 用于指定验证集，改用validation_split = 0.1 可以指定验证集比例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "9e20b539-f066-45ca-9dad-f311103dcd2f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "pd.DataFrame(history.history).plot(figsize=(8, 5))\n",
    "plt.gca().set_ylim(0, 1)\n",
    "plt.gca().set_xlim(0, 29)\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77d056d2-1ac2-4dad-aaff-6a6c4a92b1db",
   "metadata": {},
   "source": [
    "验证误差（绿色）是在每个轮次结束时计算的，训练误差（蓝色）是使用每个轮次的运行平均值计算的，因此训练曲线（蓝色）应该向左移动半个轮次，这样损失曲线几乎重合\n",
    "\n",
    "训练集的性能最终会超过验证性能，验证损失仍然在下降，可以调用fit()继续训练\n",
    "\n",
    "调整超参数，可以调整学习率、优化器、层数、每层神经元数以及激活函数类型、批处理大小（`fit()`中的`batch_size`参数，默认32）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "8b41af3f-14f2-49ec-bd54-4571044b340d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "313/313 [==============================] - 0s 812us/step - loss: 0.3324 - accuracy: 0.8816\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.33239510655403137, 0.881600022315979]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.evaluate(x_test, y_test)  # 还有batch_size，sample_weight等参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "64e3a6c8-c743-4267-9d6b-75d769e1de21",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.   , 0.   , 0.   , 0.   , 0.   , 0.003, 0.   , 0.013, 0.   ,\n",
       "        0.984],\n",
       "       [0.   , 0.   , 0.999, 0.   , 0.001, 0.   , 0.   , 0.   , 0.   ,\n",
       "        0.   ],\n",
       "       [0.   , 1.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   , 0.   ,\n",
       "        0.   ]], dtype=float32)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_new = x_test[:3]\n",
    "y_proba = model.predict(x_new)\n",
    "y_proba.round(3)  # predict() 输出概率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "6c9c3005-135e-4e96-92ad-cbf8a5aca844",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9, 2, 1], dtype=int64)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import numpy as np\n",
    "y_pred = np.argmax(model.predict(x_new), axis=-1)  # 现在只能用np.argmax()方法\n",
    "y_pred"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "3af58f5d-d308-406c-b26b-d36303566d83",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['Ankle boot', 'Pullover', 'Trouser'], dtype='<U11')"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(class_names)[y_pred]  # 对照名称输出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "00f263b3-a9a0-4c1b-8453-56eb932b9471",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([9, 2, 1], dtype=uint8)"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_new = y_test[:3]\n",
    "y_new  # 检查真实标签，可以发现归类正确"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b73c016d-d0fe-4136-aeec-d2da6e7a906e",
   "metadata": {},
   "source": [
    "# 顺序API构建回归MLP"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "cb861cf0-52ea-4625-86da-77c5468162d9",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.datasets import fetch_california_housing\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "c1a8719e-f608-4b0b-a772-ac8a0b085cb8",
   "metadata": {},
   "outputs": [],
   "source": [
    "housing = fetch_california_housing()\n",
    "x_train_full, x_test, y_train_full, y_test = train_test_split(housing.data, housing.target)\n",
    "x_train, x_valid, y_train, y_valid = train_test_split(x_train_full, y_train_full)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "0e2b4e5a-2db9-4969-90ca-183ceed48976",
   "metadata": {},
   "outputs": [],
   "source": [
    "scaler = StandardScaler()\n",
    "x_train = scaler.fit_transform(x_train)\n",
    "x_valid = scaler.transform(x_valid)\n",
    "x_test = scaler.transform(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "33988f96-6b2d-4220-8e7a-3fa77ede0a12",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(11610, 8)"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "fe90c0a2-8197-4e8c-8188-c08ac6eff0a1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(8,)"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape[1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "74e6f737-f821-4eea-a54f-b01760faa8d5",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.07674998, -1.62899571, -0.15932493, ..., -0.0574223 ,\n",
       "         1.39544332, -0.96816812],\n",
       "       [ 2.17135801,  0.67494355,  0.22767014, ..., -0.0560652 ,\n",
       "         1.06409971, -1.48177252],\n",
       "       [-1.42027667,  0.67494355, -0.52585811, ...,  0.00942699,\n",
       "        -0.70462179,  1.12115466],\n",
       "       ...,\n",
       "       [-0.81187034,  0.0393741 , -0.09373249, ..., -0.02891188,\n",
       "         1.74078736, -1.06291068],\n",
       "       [ 0.49433178,  1.31051301, -0.03514451, ..., -0.04823425,\n",
       "         0.98943073, -1.46182672],\n",
       "       [ 0.87552675,  0.11882028,  0.12712801, ..., -0.01552752,\n",
       "        -1.30197364,  1.18099206]])"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "41c4ab62-e9eb-4dfd-8d06-45a40b670d92",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "363/363 [==============================] - 1s 887us/step - loss: 0.7865 - val_loss: 0.6178\n",
      "Epoch 2/20\n",
      "363/363 [==============================] - 0s 681us/step - loss: 2.7287 - val_loss: 0.4909\n",
      "Epoch 3/20\n",
      "363/363 [==============================] - 0s 703us/step - loss: 0.5189 - val_loss: 0.4431\n",
      "Epoch 4/20\n",
      "363/363 [==============================] - 0s 678us/step - loss: 0.4561 - val_loss: 0.4184\n",
      "Epoch 5/20\n",
      "363/363 [==============================] - 0s 694us/step - loss: 0.4358 - val_loss: 0.4667\n",
      "Epoch 6/20\n",
      "363/363 [==============================] - 0s 728us/step - loss: 0.5962 - val_loss: 0.4097\n",
      "Epoch 7/20\n",
      "363/363 [==============================] - 0s 694us/step - loss: 0.4456 - val_loss: 0.4187\n",
      "Epoch 8/20\n",
      "363/363 [==============================] - 0s 689us/step - loss: 0.4293 - val_loss: 0.4029\n",
      "Epoch 9/20\n",
      "363/363 [==============================] - 0s 680us/step - loss: 0.4129 - val_loss: 0.3920\n",
      "Epoch 10/20\n",
      "363/363 [==============================] - 0s 675us/step - loss: 0.4101 - val_loss: 0.3932\n",
      "Epoch 11/20\n",
      "363/363 [==============================] - 0s 683us/step - loss: 0.4283 - val_loss: 0.3851\n",
      "Epoch 12/20\n",
      "363/363 [==============================] - 0s 736us/step - loss: 0.3982 - val_loss: 0.3799\n",
      "Epoch 13/20\n",
      "363/363 [==============================] - 0s 708us/step - loss: 0.4092 - val_loss: 0.3896\n",
      "Epoch 14/20\n",
      "363/363 [==============================] - 0s 697us/step - loss: 0.3938 - val_loss: 0.3799\n",
      "Epoch 15/20\n",
      "363/363 [==============================] - 0s 675us/step - loss: 0.3892 - val_loss: 0.3734\n",
      "Epoch 16/20\n",
      "363/363 [==============================] - 0s 689us/step - loss: 0.3895 - val_loss: 0.3712\n",
      "Epoch 17/20\n",
      "363/363 [==============================] - 0s 675us/step - loss: 0.3853 - val_loss: 0.3681\n",
      "Epoch 18/20\n",
      "363/363 [==============================] - 0s 697us/step - loss: 0.3915 - val_loss: 0.3673\n",
      "Epoch 19/20\n",
      "363/363 [==============================] - 0s 752us/step - loss: 0.3823 - val_loss: 0.3617\n",
      "Epoch 20/20\n",
      "363/363 [==============================] - 0s 716us/step - loss: 0.3811 - val_loss: 0.3584\n",
      "162/162 [==============================] - 0s 490us/step - loss: 0.3613\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation='relu', input_shape=x_train.shape[1:]),  # 输入层8个神经元（特征）\n",
    "    keras.layers.Dense(1),  # 输出层1个神经元（返回一个值）\n",
    "])\n",
    "model.compile(loss='mean_squared_error', optimizer='sgd')\n",
    "history = model.fit(x_train, y_train, epochs=20, \n",
    "                    validation_data=(x_valid, y_valid))\n",
    "\n",
    "mse_test = model.evaluate(x_test, y_test)\n",
    "x_new = x_test[:3]\n",
    "y_pred = model.predict(x_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "920ca9dd-e364-4693-8421-20d353191827",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " dense_3 (Dense)             (None, 30)                270       \n",
      "                                                                 \n",
      " dense_4 (Dense)             (None, 1)                 31        \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 301\n",
      "Trainable params: 301\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "5d2f2778-f5a1-455f-b700-406f64dfa4b9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>loss</th>\n",
       "      <th>val_loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.786461</td>\n",
       "      <td>0.617785</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2.728662</td>\n",
       "      <td>0.490946</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.518901</td>\n",
       "      <td>0.443066</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.456138</td>\n",
       "      <td>0.418413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.435787</td>\n",
       "      <td>0.466656</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       loss  val_loss\n",
       "0  0.786461  0.617785\n",
       "1  2.728662  0.490946\n",
       "2  0.518901  0.443066\n",
       "3  0.456138  0.418413\n",
       "4  0.435787  0.466656"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(history.history).head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "9d3c91ae-c1ad-40d5-81dd-87daf5a43f06",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXQAAAD8CAYAAABn919SAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAvMElEQVR4nO3deXxU9b3/8dd3lsxkTwghAULCDrLIFgE3DLih1VqtFXCrVkXcav1Vf+rP29Zbb6+ttrXVoshtKXXpBereStVWjBERZJEdwRAghD0hCdmXme/vjzNZyTKTzHJm+Dwfj3nMcs6c88lheM93vud7zlFaa4QQQoQ/S6gLEEII4R8S6EIIESEk0IUQIkJIoAshRISQQBdCiAghgS6EEBGi20BXSi1RSh1XSm3vZLpSSj2vlMpXSm1VSk32f5lCCCG6400LfSkwu4vpVwAjPLf5wEu9L0sIIYSvug10rXUecLKLWa4BXtGGtUCSUqq/vwoUQgjhHZsfljEQONjqeZHntSPtZ1RKzcdoxRMdHT1l0KBBPVqh2+2mtF5R1aDJjA/8boAjVW4sKNJilVfzu91uLBZz754we41SX+9Ifb1j5vr27NlTrLVO7WiaPwK9o5Tr8HwCWuvFwGKA7OxsvWHDhh6tMDc3l/dPJLM6v5gvHr+4R8vwxdzFX+B2w4oF53o1f25uLjk5OYEtqpfMXqPU1ztSX++YuT6l1IHOpvnjK6gIaN3UzgAO+2G5XappcBFttwZ6NQA47VbqGl1BWZcQQvSUPwL9PeBWz2iX6UC51vq07hZ/q21w4QhSoDtsFmob3EFZlxBC9FS3XS5Kqf8FcoC+Sqki4GeAHUBrvQhYCVwJ5APVwO2BKra12gY30fbg9HFJC10IEQ66DXSt9bxupmvgPr9V5KWaBhfRUdJCFyLcNDQ0EBcXx65du0JdSqcSExNDXp/T6SQjIwO73e71e/yxUzQkaupdJEV7/4f2hrTQhfCfoqIi0tLSyMjIQCnvRo4FW0VFBfHx8SFbv9aakpISioqKGDJkiNfvM+e4HC/UNrpwSgtdiLBTW1tLYmKiacPcDJRSpKSkUFtb69P7wjfQ64M/ykWu7iSEf0iYd68n2yhsAz2YwxYdNgtuDQ0uCXQhhHmFdaA7gzjKBZB+dCEiRFxcXKhLCIiwDHSttWfYYvBa6ID0owshTC0sA70pV4O2U1Ra6EJEJK01jzzyCOPGjWP8+PEsX74cgKNHjzJjxgwmTpzIuHHj+Oyzz3C5XNx2223N8z733HMhrv50YTlssd6Tq06btNCFCGf/+fcd7Dx8yq/LHDMggZ9dPdared966y02b97Mli1bKC4u5pxzzmHGjBn87W9/4/LLL+eJJ57A5XJRXV3N5s2bOXToENu3G5eGKCsr82vd/hCWLfR6t7FzMlgHFjX1odc2SAtdiEiyevVq5s2bh9VqJS0tjYsuuoj169czefJk/vznP/Pkk0+ybds24uPjGTp0KAUFBTzwwAN88MEHJCQkhLr804R1Cz2YwxYB6hqlhS6EP3nbkg6UzoYin3/++eTl5fH+++9zyy238Mgjj3DrrbeyZcsWPvzwQxYuXMiKFStYsmRJkCvuWli20Os8wwedQd4pWictdCEiyowZM1i+fDkul4sTJ06Ql5fH1KlTKSwspF+/ftx1113ccccdbNq0ieLiYtxuN9/97nd56qmn2LRpU6jLP01YttCbcjX4wxalhS5EJLn22mv54osvmDBhAkopnnnmGdLT03nnnXeYM2cOdruduLg4XnnlFQ4dOsTtt9+O223kwNNPPx3i6k8XloFe78nV4A9blBa6EJGgsrISMI7GfPbZZ3n22WfbTL/ppptYsGDBae8zY6u8tbDucgn2TlFpoQshzCwsA7152KK00IUQolmYBrqnhS6jXIQQoll4BnrTkaLSQhdCiGbhGehN49CDeD50kBa6EMLcwjTQPePQbcEp32a1YLMoaaELIUwtTAMd7FaFzRq88o2LXEgLXQhhXuEZ6G4dtP7zJsZl6KSFLsSZpqtzp+/fv59x48YFsZquhWegu4K3Q7SJ026Vsy0KIUwtPI8UdemgDVls4rBZ5HzoQvjbPx+Do9v8u8z08XDFLzud/Oijj5KVlcW9994LwJNPPolSiry8PEpLS2loaOCJJ55g7ty5Pq22traWe+65hw0bNmCz2fjtb3/LzJkz2bFjB7fffjv19fW43W7efPNNBgwYwA033EBRUREul4uf/OQnzJkzp1d/NoRroLuDNwa9iUNa6EJEhLlz5/KjH/2oOdBXrFjBBx98wEMPPURCQgLFxcVMnTqVOXPm+HSh5oULFwKwbds2vv76ay677DL27NnDokWLePDBB7npppuor6/H5XKxcuVKBgwYwPvv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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "pd.DataFrame(history.history).plot()\n",
    "plt.grid(True)\n",
    "plt.gca().set_ylim(0, 1)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7e8cf19-18cc-49a1-a34e-3f8f8ee03d22",
   "metadata": {},
   "source": [
    "# 使用函数式API（宽深）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "31380b71-7381-4523-8d37-226b577e850a",
   "metadata": {},
   "source": [
    "非顺序神经网络的一个示例——宽深神经网络，这种架构既可以实现常规深度学习，也可以通过短路径执行简单规则（可以提供手动设计的特征工程）\n",
    "\n",
    "宽路径指跨越隐藏层的较短路径，深路径指包含多个隐藏层的较长路径"
   ]
  },
  {
   "attachments": {
    "ddf137c1-008e-421b-a0b4-a1b7cbe9a803.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQwAAAEoCAYAAACtsc+zAAAgAElEQVR4nOydeZhcVZn/P/fWvnb1mnSW7uwJCSESCSCbkAcYQBQFBkFhVJxnxFF/LgOOo2J0RkZFxQn6oDPgDOKgQWBYhLCKgxhgZE0IZN+70+nu9Fr7rbv8/qg+p2/druotnXRTqW+ePN19l3PPPfec73nPe95FOZjOWI1+HxVUMBpYlgVAX18fixcv5oYbbmDNmjUoioKiKJNcuwqOFCagOo4dTGfYns4BoFbIooLRwjRNTNPEMAxee+01Dh8+zMaNGzFNExgkkwrKCzMCfurV/Ld1kkkFFZSEXYK49957qaqqYv369bz00kuSLCqkUZ5YWBUh2XW4QhgVjB6CDDRN45VXXqGpqYlYLMaTTz6JaZoVsihjeBWFbGd7hTAqGDvuv/9+du7cSSQSIRQKcd999xGPxye7WhUcZRj9fRXCqGD0UBQFwzDYuHEjgUCAWbNm4fF42LNnD/v27atIGGWOdHdXhTAqGBt27NjBPffcQzQapbm5mZqaGmKxGD//+c8ruyRlgGEJQdcrhFHB2PDkk0+iaRqLFi3ihRdewOPxUFdXx3333ceePXsmu3oVHGVUCKOCUcM0TX71q1/h9/upqqqip6cHt9tNVVUVmUyGv/zlL5VlSZmjQhgVDAvLsuQOyB/+8Ae2bt1KLBajt7eXTCZDKpUiHA7T2NjIv/zLvxRcXyGP8kOFMCoYEWLw/+53vyMWi9HU1IRpmjQ2NtLc3EwsFiMajdLe3s7evXvlPRWUHyqEUcGokM1mefTRR5kxYwYAbW1txONxDh06xP79+6mtrcXn8/HAAw8AFcIoV1QIo4IRYZomhw4dYtasWZx//vl87nOfY86cOezZs4dUKsUXvvAFPve5z3HmmWeyfPlyaSpeQfnBPdkVqGDqQ1EUmpqaeOWVV7AsC0VR2LdvH08//TQzZ87k2muvBeDDH/5wwT0VlB8qEkYFw0IMfLHEEF6piqJI8rD/bb+ngvJDRcKoYES43UO7iSCIdDoNgKqqqGpl/il3VL5wBeOC2DkpRiYVlC8qhFHBuKAoCqqq4na7K0uQ4wgVwqhg3KhsnR5/qBBGBeNChSyOT1QWoBWMC6NZhoyVUoqXOLSU4cstUopVquwxVeSIUare76YFXYUwKhgXjp2EMZbnvJuG3rsTFcKoYJzI215oWq70JWMkFWu0433YYsthHp+6OO4Iw+lF6TRMsh8bS5mjvUdce6yMnOzPGi0sC5zVypehoCiDbeXzBchmNXTdwO12DSlH1zVcLlf+HS0Lc+Dds9ksmqah6zrhUAiP14umaXi8XizLorOzk/qGepKJJD09fRimwYzGGcTjcRRVIRqOoOd0AoEACnmKUAAUC5T89+3v7ycajQ4cd2FJIhn83kPfceC9Lfuxwe9U7DsP177Ob2yY5uD9CigM7XvFylBVdcrsRB2XhGGaZoGRkXDHLvVRnNfbUYxwnOfNgY6Sy+VIJpPouo6qqvh8PmnwFI/HyeVyGIZRkkw0TSMej9PZ2cnWrVsJhUIkEglUVUXTNCKRCPF4HMMwBjupYQxbT9OEeDzBvr37iFVXc7C1FcuyONzVjqIo+P1+vAMDurq6hlislrfeeouqaJRFCxfT2tLG6aefOVBvE1V1yeepKkybPo3u7m4ymSyGYeByqeS0HNlslpyuU1NTDSjoho7P58M0TQ4fPkx1dTWJZIK+vj503WDFihW0tBzAsiwC/gCmbhAMBQeEmPyg0rJafiAqCr09vcRiMUzLQlVdg2058LdhGFjkv3k0EsUf8BPwB1AUC9PU0XWdUChEXV0d4XCYUCiEz+eT5Yg+YW9Xu9Wrx+PBMAyCwSCJRIJQKEQqnWbhooUYhkFzczPV1dVo2SybNm7ife97H6FQiGw2S0NDw5S1mj3uCEPk1dA0DQBd1zFNk3Q6jd/vL7Bg7OrqwuVyoes6W7dupaenBxgqpZimyc6dO9m9e7csL5VKoSgKLle+c7rdbvr6+mhvbyeTyeDz+YhGowQCASzLor29nZ6eHjRNw+fzoWkabrcbn8+HrusYhoHX60XXdRRFwTswG8PgLCfeyefzyXP2dxLX2EnM6w3g9fhkR3e5XHnnMUWXbZVOp/F6veRyOi7Vi8vlYq9hMG3aNDweDzktR29fL6Zh4vF4ZLvoLhdth3sIRyJ4PG4yuRw+xU3GgJSm4/F4SetgmjqmbpBKJ1EUCASr6O7JE2EgEARF4WDbQbJaDpeq0p9MktEy1Pu9Ms6o1+tF9QfQsjlM00L1Beno6c+3p8uF1+uRdRMSjmVZeD0e+vvjKIqSJywjh6ZlJHGnUikMwyAQCMg2E+3q8XhIpVIFbWuPB+LxeFBVFZfLlZ8YXCr6QLmibXVdR8tk8fl8NDQ00NXVxYknnsgpp5zCP//zP+PzTa28QWVLGGLmMc0883d3d/E///MQDz30CIl4grZDbaiqSvuhQ8TjCVTXoOWiYRjS49Lv9+N2u/F4PHKgWZaCx+3B7/ejqi5UNX/ctKz8vZaFS1VRXS7cbheqW8WlquT0HFk9h8vrxTBN+vvjpNPZgXpCdXUtqponMbfbjdfrxePx4PH6CFVVD3TQJP5AAJ/Xi6XrRCNhYlUxQuFQfobKZMhmM0SjUTKZjIzmrbhUwrEY1bFqUBSmTWsgVhVDy2RxqS58Ph+GYaC6XAQDAVTynd7lcuHxeAZmVBeZdAaLfDtFwhEy2eyAebiFx+2hKhZD1/OSlOJy43K5qK2rJRwKk0qnSCaSqC6VSDgfcTyZSqLndBKJBFo2i6qq+WjkwRBZLYumZZg+fTr19fVYgEtVaT14kJ7eHkKhMC0tLei6TnV1DK/Xj57T8Xq9RKNRwuEwyWSS1pYD9PX24vf7qa6pIRGPk0qn8Xq8uNwuEokEOS3H4FqkUArzeDzsb23F5XIxc8ZMcnqOAwdaaG8/NECmPlRVoaenl6qqKF6PF3/Aj2EYHO48TDyRwOVSMXQdQzexLJNMJkN7ezupVBqPz0cikSCRSOALhDjQeoi33v4V+/bt41e/+lWBZDPZGeYUq0w31PNZuizAYsuWrVxxxZV0dXURCoaxLMhkMvlOH4ng8XjIZBMFEoHP5+Okk06ipaWFcDiM2+3G7c4PAJfqIZfTCQaDBAIBpk1roLa2HpfHJdecgUCQQCA/CJOZJHV1ddTV1UnyCXj9eD0eLMsiHI4QDAaJRiOoqlIgEQAoqoqpKPk19sD7KWINXET3ojg6vKLkj5jYhoRl5bcb1fxK2rRsZWLh4sjF4SPRC00kxGwuZvrxIGeaWANtowzocgQsm3qkwEmPQf2KBagDbSyutwY+qCnKsCwsy+TFF1/mWzd/k7ff2sTf/M3fcOutt0qL2skkjHvuuad8JYz8oDN54403+OAHP0QgEOCMM87guuuuo6mpmaqqKKlkCpfbRUN9A15fYVOoqko4HCaXy+HxeIqYQA8owRjsFCagKgODckDlb1pm3jxOdBbyg1JhcPCPpDS1LBMVS5YjFGaWZeUfCAXiskKRsixhpWcNEo/o4IqCSyzxsYprPY8AU2EdLghjvFAFiWOhSr3FAMnayQMGDwx8HsvK3zOoUM3/bZEnalVRUFSwLAXLUjnrzDO4/3f38bef/jS//OUvmTFjBl/5ylemhPKzbCUMy7I4dKidc855P4cOHeL888/n9tvXMmvWzHGXadeUO1vNPnOIeVzkInW53flBr6jOC4ve71SkWZaJwkBQGvvtikqeuAaeKQjDKq69HySowoP2WdB+7URJGJPdyaF4XYQUN5pZW7blQENZ2HjBwa92SdB+Xent4MJnC9L+05/+xIc//GHcbjcdHR0Fy5LJQFlLGJaVD4m/f/9+TjzxRH72s58xbVoDMNjgQjklxNTRfIjBj1bknO3ZWBaKBZZpotjOKvLmoVGpFMVeiq0+ioJlt+IveLY1ILnkl18Kg1NeweAY+Df0/kH/AMeG4dAXHCOmAlEIlKrLaOuoKLbRrhS2jrMI+98Fp0o+ytnyeelj5syZuFwustnsqOp4LFC2hAHw2GOPoaoq1113HdOnT8NJ8UdrPSh0BljWgB7liEukeG8rEQrPYpAcCg/jlCcUZ+8X11qDd4zFlqNYe47l3iFS0QR/n6miVxkJdulH1/Ux2focTZQtYSgKbN++DV3XmD9/Li7XUGXXhH8A+8yiKCiqC7970C6hEKNXvpWupVr0GsM05HZjNpvF7/cX1su+/FFLkdFghxX6EbFzZDc+E9KZGIil1tn2OJ9Dl1z5csRz7ArfiVy3F7PBGT2OvZ+m+IZiK30qoGwJA2DZsmVs2bKFmpqaya7KMYdlWTz++OP86Ec/4v7776ehoUEOxng8zoc//GE+85nP8NGPfrRkGWJ2cy7Zvve977Fp0yZ+85vfyIG9fft23G43CxYsKFrWunXraG1tBaCxsZHq6mri8Ti9vb20trayePFiAPbv38++ffv4whe+wLJlyyasPQQ0TSsg0KkK0da+gS3XqYKyJgxdz+/Jh0Khya7KMYXobNu2beOVV15h27Zt1NfXI6xNf/KTn/DCCy9gWRZXXnml3D1wzvQA7e3tHDx4kFNOOQUY3KI8cOCAXNJZlsWaNWtoamrihz/84ZD66LrO7bffzq5du1i0aFGB9amQJp555hlp/LR582Y+8IEPsHTp0gmfWaeaIdRwmIrJoMqaMMQuxfGGgwcP4vf7efbZZzn11FNZtGgRO3bsoL6+nueff561a9fyyCOPcPPNN3PTTTfxgx/8oGBpYZqmDL23bt06vv3tb9PX1yftVABOPfXUAqJ5+eWXSxKzSKf4/ve/n/vvv7/kkkX4kSxduvRoNMukGz2NB729vVMqVmpZE0ZfXx/WgPXl8YTzzjsPwzDYv38/jY2NrF69mpaWFj772c/y7LPP8vWvf52LLrqIpqYmPvrRj5LNZlmzZg01NTXSutOO0czKlmUxa9asYa957bXX+MAHPkBXV9eQc2JQZLNZksmkLPN4htBhTCWpqKwJQ9M0QqHQERnsvBvxyCOP8Pvf/54f/vCHPPfcc9TV1fHGG2/wta99jc7OThoaGvJ76m43n/zkJ7n11lt56qmnuOSSS/jGN75BXV1dgbJR+GA4vWzF72IJEwgEStbJNE2WLl3K17/+dVKpVNFrRJnd3d2cdtppU2pmnSxMtWjsZU0YyWSS/v7+444wFi9ezO23387cuXO56qqrWLNmDTfeeCMLFy7k4osv5tFHH5W7BbFYjJdffpnvfve7vPHGGyQSCanvsCwLr9dLJpMp2CGBwSWEWMLY9RmlxP5oNMrpp5/O9u3bpZLTsiw6OjoIh8OEw2Hi8bjUuUyVrcTJgvBtEk6FUwFlTRher3eyqzApaGlp4YEHHuDuu+/m6quvJhqN8rWvfY0LLriAUCjEvn376Ovr45xzzqGjo4NsNsu2bdv45S9/SXNzsyxHURQ0TSOTyXDLLbfw9ttvs3LlSl599VUSiQRf+cpXSCaTzJs3L+91OeAJWwzC1P7Pf/4zF198sXRoE7BbXBqGwXPPPceqVauOeltNZdi3sqcKypYwLMsil8sdlzPUHXfcwbRp05gzZw65XI7a2lpWrFjBWWedhdvtJp1O09rayjPPPMOnPvUpfvGLX7Br1y7q6uoKFJmQtzb88Ic/TGtrKyeccAIej4c9e/bQ0NBAU1OTlDK+/OUvs2rVqkKnOYeScebMmZx22mls3rw5745u01sIchf3VFdXH8smm5KwLGtK2WBAGROGoii0tLRQVVU15Vj6aGPfvn10dnbyiU98AsMwWLNmDaqq0tLSwte//nU+8pGPsHLlSjo7O+nq6sI0TUKhkFyKQH4rNJVK0dHRwS233EJzc7PcPUkk8oFtvvKVr8hrNU3j4x//OKZpcs455wzx2cjlcnR3d7N161Y2bdrEggUL2LNnD263m1AoxJw5c2TckIMHD7J//37OPfdc5s+fPyltOBUw2b4jxVC2hAH5mUvEtzie8N3vfhfDMEgkEpx33nncddddGEY+atW6det49NFH5bXLly+npqZmSKcUhHvjjTeyfPlympqa0LTBkHtOE2ufz8eePXvYtWsXZ599doGiLh6Ps3v3bs477zwuuuiivEOey0VPTw+maTJjxgx0XSeZTOJ2u+W9v/zlL49bwhCSmqqqU2q3qKwJwzRN6Z7+boHThHrM3pTAnDlzME2TgwcPSkMrEQ3sk5/8JG63mzfffBNFUUqaXiuKOhDDowFFyUeN8vsDBcpNofAUMAyDxYsXFyiZTdNk27ZtHDp0iPe85z0cPHhQGmidc845VFdX89RTT2EYBnfddRdXX301VVVVQ9ri3QQZ72IgggaKZQtrMFpnt/x1IuLbVEFZE4aiKGQymcmuxphg97MYz8xiWRZbtmxh9+7d9Pf3k81mOfPMMznjjDPIZDLs3LmTefPmSbNv+31O4vD7AzZjrLzDmtgdgcEBLdpZKD1FOSJy2d13300kEuG8886TOyo/+9nP2LZtG6+99hqmabJlyxa++tWvsnnzZm6//fYpt504VuQDHg+6+o11USHaMJfLTan8tVOnJkcBpmlOKXYeDYSiC/I7CyJe5WhhGAYXXngh4XCYVatW4fP5eOSRR5g/fz5PPfUUmqZx4MABua2aTqelYs1JGiI8n2Xl9RSJRIJAwE8ymSSTycj/breb1tZW9u3bN6Q+uq6zYcMGLr300nyUb0XhT3/6E//yL//Cv/7rvzJ//nwsy2LZsmV8/vOf56c//SnLli3jhhtuOPLGnCRkcxput+eIAgTYHf+mEsqaMIBhjYkmGsNFDh/LfWKWdrlcg2H6RwFFyUerfvjhh5k1axaaprF+/XoWLVqEy5UPH3j99dcTjUb593//d8477zyefvrpovXOm2kfpr29neuv/xSGYZLLabgHYmBalsUTTzyBrut4PB6ampoKbDME/uu//osdO3bw/e9/H1VV2b17N9dccw0Ab7zxBt/85jd59tlncbvd1NTUUFtby7e+9S0uuugimpubJ1Thd7Rd58Uz9u8/QPPcucBANK0JKHOqoGwJQ6zPj6VZrX2HQRjdjAWmabJ7927mz58/Zr8H+7UrV65EURRaB1IGCIcyQRq33Xab9O/Yvn07a9eulco1ezkNDfWsWfMtIpEoM2fOpKGhHpdLlXWzL59mz57N+973voL6mKbJnXfeycUXX8zq1asxTZPu7m6mTZvG6tWr8fv9WJbFJz/5SZYvX04sFiObzfKxj32M7du3F9iETBSOhTFYNqcNxCNR82ThDGU2CtjrOJWkjLIljGJKudHeB6OffYqZSouBWepagWI7E52dnSxYsGBIx3buSgxXTzGYI5EIc+fOJZ1OEwgEqK2tJRgMMmvWLH7wgx9gWRYf+chHePbZZ7n11luHlOX1evn85z8/cHxAbVeiWUzT5Le//S1zB2ZW4ZPy4IMPyuDHiqJwyimn8Nprrw0hHPFTURSefPLJArKYyFB/wubjaDqiqS51INaq0GCMHfZ4IFPJUrmsY3rGYjEAXnrppVF7QI5VbDUMo0A5N9z1zh2QYtfa40/YPUjtwWbseDcrBu1wkoZoG7HTZZrmES8vLSufZ0ToUiZ6uSMUum1tbTQ2NgLj95C1LIudO3fKmCCZTGbS7TLuueeeSQgjdIwgBpdQ3I0Ho+HSsexmjMYeRGxzFpM+DMOQZZSjn4VIGmSHoiik0+kJW1oGg8GjJ1kMfDtBFkc6F9sl1qmCsiUMGBSLxzILl5oRBDE4CWI0Ck3xX2TGGq787u7uoiRkWRbZbJZnnnmmIBViOcHv9w8ZHOPRBU027Dqe8X4n0U9E+sypgnfXlxgDxIAb77ZqsY8tth/tnXos7B8IBIqSl92uIRgMliQVn88n/UHKbSXpbFcB4bQ2Uc84WiilSzoSiOWu3dpzsieKsiUMyDduIBCYMEvP8cx0dr3DcJKO2NUROwd22O8Xg2eyO04FRxeKorB79+6ieqvJRNkTRnd3N3v37mXWrFlyi9F5zWgxUWvS4c45Ta/FMcsS2XIGyxCpDEb7zJGUZqN5v1LLqZEwlmWc/Z7RXDvS7FvsvOWwxCz8Wfodh69PvgTLsTkiyjNMYyADmq0e4i6bUlvoq9atW4dlWbz3ve8d7vWPKcpWh2FZFsuXL8c0TdauXTuuLVZneTDYYYTZszBWcgaYsd9n3wFw/ncGoil1vSlSEVmgm/mEz/bnF9OxlNpdKaWPsddDhLcX71XqOc73ddbJedxZVrE6CTsWcVxkr3deL8pyPrfUO4p3siwL0zIxxLuKRNrid6z831b+uElhXQq/L5imhWHkM9eaZr4c0xzMSWNa+fLyeVQHymXgm9rqZ3+XO+64g8cee4xgMMh3vvMdpgrKVsJQFIWvfe1rXHPNNfzxj39kw4YNnHnmmXLrS7hSjxb2weecZZyzQ7GtWfu2m2maxONx+vr60DRNhqzL5XL09PSUeiEA2jvaMU2T3t5eerq6qa6uZsGCBeRyOQKBAK2trRw+fDifkTyXIxaLkUgk6OjoGDFyk6i/z+dj//79uN1uamtrpa+ISEY9HPKZ3KGrq4v9+/fLQXDiiSfS09PD1q1bSaVSxGIxgsGgXKcbhkF/fz9er5f3vOc9vP322zIxdiaTkcpguzJRVVXcbjdLliyhs7OTadOm4ff7mTVrVsG33b9/P+3t7SxatIhDhw4NKMPd5HSLgN9P1YDBWCadwetzEYmGUVUVj8eDz+vNk8JAbtaqqioZEDn/mfN1CYVChEJBFEXF6/VSFYvR1naQ5cuXU19fj2latB1qZeaMmQMJt1U0TcPr9aCgEggGcKkq/f1x7v3NvTz+2GMEAgE+9KEPce6550rDu8lGWdthGIbBN7/5TW677TaCwSBXXXUVl112GfX19QX2E11dXXKAAXR3d+Pz+dB1nf7+fsLhMG1tbXR2dgL5eBNVVVX4/X5yuZyMDyFiSORyOXlcEIU9dL99IIi6ChNw4cAlBprH48Hn95PJZuQsKwZMwO9HHeigdld+8VM8T9M06Tvi8XjQNC2fQT4QKJCORFo+y7IIhULouk46nZbGQ9lsFlVV5aDp7e2V8UaEk1oqlSKbzebr7fMVzO5er5f6+noZ6DcUCqFpGrlcTkoRwrzdnnBI1FsQi67rUvoR1+QHnxeXyyW/YygUwjRNNE1D0zQMwxisFwqmmb9XkKHf70d1gWnm8Hq9GIYhbUBUBklftHXeGM2FZ8DXR/gu5XI5LNPEO/D+YsLw+T0cPnwYyyZJGKaFiopr4JsJUgoE/Fx5xeV89atfJRaLDVmyTgbuueee8iYM0zTJZDKsXbuWO+64A1VV6e7uRtd1uWORSqVkZ08mkwWWdcFgkFQqJU3MxSASxlU1NTX09PTgdrtlZxEzn9iTF8SUd+IadCjSdV1ahLpcLrxeLz6fr2CJEwqFZGcLRyNym83tduP1etGyGgxcq+s64XBYDhCXy0U0GqWqqopoNEpNTQ0ul4t4PE40GsXlcpFOp/ODZGDQ2b1P3W43Pp8Pl8tFdXU1nZ2dZDIZfD4fy5cv5ze/+Q0PPvggP/rRjzj99NN5/fXXZYqAmpoaQqEQvb29eL1e/H4/mUyGVCollwRi4FZVVeH1eosub5zfs5iFq2XlEzNFIhHZtolEgmg0Kr9pKBSS96fT6YFo8pDT83qMTCZNJpMFLDLZNIlEXEqBkCcey8j/HQwGZZxN3TCwVBfpVIrOzs788VyO/t5eVEUlmUySTCZJpVJYloXbk+9bwuo1/w4KKG5My2Tf3n2sXLmSdDrNmpu/wdITlgCMyZ/oaKKskzFDfgD4/X5uuukmli5dyn//93+za9cuGbpP/DcMg2g0SmNjo4yYHQ6H0TRNShKappFMJvH5fHi9XnK5nJxxg8EgDQ0NmKaJx+Ohuroan88nB6Pf78fn86EoipwF7aQiIlkJiUU4dIVCISnpuDxuuVxwuVzkE3xbuAa23Maz7TacAtO5/LLrWFRV5YUXXiCZTBKJRFi8eDFLliyRZTi3AcW9o0l6PVpFpx2ClO332hXczjLl8lJ1LC1t11qm7R4FGcnCXlZevyEUyYP6Z2UgvfvQdjClZtUS+gsUDNMi3t9PV3c3s2c34fG4cQFYU8eHRKBsJQwYXns/nK7BqZMYCc6Zr9jvo4GzUxctQ6rybT20RDnOAVTqWc5nloIY+L29vZx55pns27ePK6+8Mi+q2nZgipVTqh6lUExPNNzxccHp7iGKcrbtMG1tCf+agnJkQYPPsD/TcY39t1J+ahUJ4xhgpEYuZWwz0vbjSGWV+n0sGLYMRZ4YfxkjXF/qvIjetWfPHubPn8/69eulpDGaciaiPSaivMECSv3ubPMSzx/VvcVuVIqcPnJX+KONst1WrWDiIRS369atIxwO09jYSDqd5rHHHpvsqlVwjFAhjApGDUXJx9j49a9/TTAYJBgMUl1dzX333Scd48p4hVsBFcKoYIx49dVXsSyLOXPm4PF4CIfDvP7663R3d0+pQC8VHB1UCKOCEWHfhbn11lsJh8PU1NQQiUR4//vfz8GDB3nwwQfLJjZHBaVR+cIVDAu7qfiBAwfYuXOn3CZ+8sknpU3LvffeO9lVnRSMZD9SbqgQRgWjgqLkUwOk02kikQjt7e243W7i8TgLFy5k586dvPPOO5NdzWMOu6Xs8YAKYVQwIoRx2X/9138RDoeJxWIcPHgQRVHo7e2lvr4egHXr1k1yTY89hGXv8YLj500rGDdM0+T1118nkUgQDofZs2cPPp+PSCRCV1cXfX191NTU8Nprr73r8sAcKSbTt2MyUCGMCkaEZVn89re/pbq6mmg0SlNTE52dnSQSCUKhEOFwGEVReOGFF9i0adNkV7eCo4iytvSsYGKgqioXX3wxF1xwgfQZOfXUU2lvb+fGG2/k+uuvp6uri7a2Nk444SYOuKkAACAASURBVIRJru2xw2jM7csNFcKoYFgoSj7W5l/91V8VOKDNnz+fV199lenTpxMOhwmHw8yZM+e4GDR2DBcnpRxRWZJUMCYIV23hDSq8a+2xPY4nxONx6XV8PKBCGBWMGpZl0d/fLwlDBMUR0bKmUjj8Y4XB7PbHBypLkgpGDUVRiMViBUGGhCgujh9PEIGGjiccX1+4giOGPVCvM2bI8SKWH8+oEEYFY4Ku6zKepR3H20x7vKJCGBWMGnYR3B7CX4QrtAc6rqA8USGMCsYEEWm8WMb6sYYkrODdh4oceZyjWDIhZ1xSe6xT+z2CNEQofr/fP6RMZ9liC7LUNfbniecXC0xsd/iSQXltEo4zHqsIwqsoqoyOpyiV+XKsqBBGBQVwkoIYnMUCFEM+YncwGBxiuOQkHudPJ4oFCS4VpNn+u53kVFUtiGwuylBV8hG7ATCxrIqCdrwoW8I4WqLxSNGvh0Qbt+w/Jq5Owg7Crmy0182yLFKpFPF4XB4XCZTsZQiIgSYMkbZs2YKqqsycOZPa2lp27dpFPB6nurqaWbNmkc1mCYVCrFu3jpqaGhmer6amhmg0imVZbN68WaZeUBSFzs5OlixZwvbt22VOFq/XK6UOv99PNBrl0KFDeL1epk2bRn19Pf39/fT399PT04OmaTKZ0sGDBzFNk+bmZmpra2ltbZV5VPr7++ns7KS+vp5wOEQmk2bRokV0dHRQV1c3kLdkqITh/H6WZeH3+8lmswXnRa4QkTLC5/Ph8/nkPWONNj/SdVMFZZtmQAyo4ULu23NZAtJyUaBU2P/e3l4OHDhAKpWivb1dpge051eV63ryyWpMy0JRLCzLpK+vh0Pt7dTV1pHNavT29nLwYCupVIpoNEYgEMDv95NKpUin0zJ9ovAEFXldM5kMwWCwQJ8gZlfDMGhtbWXHjh14PB50XScWi9Hb2yuvEZKDs218Pp/M+lWsLcLhMJZlMWvWLFpaWshkMgVl2TOpiYElgvDYJQLR5sXaWJQlvqG4zuPxyMHrtLD0+Xwy7aQ4Lt5FXJ/NZmVeGeeyxvl8cU9NTQ1dXV0yXaFITOVyuQgEArjdburq6qitrS0gcufySrSJIByAuro6SXBVVVXMmzePWCzG5ZdfTiAQkPdMBdIo68xn9sS8uq7zn//5n7zwwgtks1lSqRSmacocpP39/SiKQiQSoaOjg0QiUZDe0NlEoqOKgSD+tg+wwY+soKqugcFioCjg8eSzimUy2YGcqP6BZ4m0f7mCNT8gM7UlEgm5rSk6bCaTkZKEyJaWTCZxuVwEg0Hq6upIp9MEAgGi0SiBQICGhgaZJEnXdTmQPB4PgEysJLK6pVIp3G63TFHo8XjweDxs3ryZlStXUldXh67rdHZ2kkwmC6QHwzAIh8PE43GpNBUpBevr65k+fTqKosg8s4cPH0bTNOrq6mhsbJTfKJvNcuqpp2JZFt3d3Rw+fJj+/n5M0yQajRKJRKRU4/V6CYVCkiRqampobm5mw4YNMsGQfZlk/9vlcslUkiJ5VSaTIZvNypSRvb29pFIpDMOQGfN0XSeRSKBpGuFwGI/HQ3t7u0wDae+bom+5XC5M0yQQCEgpy+PxsHDhQn784x9z8sknTxk/lbImDDHTJRIJPvOZz/Dss8/KFIe6rssPIzrvySefTGtrK/F4XH7sRCLBjBkz8Pl8ckYRqe5EDsza2lqmTZtGNBotuoYH5GwOSMVgNpvB7/dRU1OD1+ulq6sLv99PQ8N03G432WyWbDZLOBymtrZW/r1gwYKS+UacegPxbPsuhvO/uM+pcHRKY6WOC7sMZ12cEAPEec1wHp/F9BVOIzH7oHdKK85jzjKLPbeYDqdY+9ilV3uKSafUMlw0LlGmINo9e/awe/duHnroIbZt20Zvby9PPfUUJ598ckEdJ4s8ypowTNOkr6+Pq6++mhdffJHFixdz3XXX8dGPfhRFUejr6yOZTDJt2jTcbjfBYHDI7KlpmpxlgSGdb7T1ME1jYODaRehSHWkg3+ZxDKeS9WgMkOGIarIgiCibzfKNb3yDhx9+mLlz5/L73/+eYDAol0STSRhlq/RUFIXvfve7/OUvf+GUU07h7rvvZsaMGQVrR+c2n3P2Eco6+7Gx1wOSyTjBYBi3Wy2eNq+CAjiTRB9NpFIpuRyYClCUfP7dL37xi/zv//4vL7/8MnfddRef//znJ7tqQBkabomBv3fvXn7xi18wY8YMvvzlLzNz5kypcBKipZ2txTG7fmI0yYNHg76BdXYhxl6mndSOBPY1u9D1HEnZzrKKPWcszxD6mlLi/ES1A4xPajyaEI59TU1NXH755cyYMYPXX38dmBpS0NRqrSOEvRO98MIL6LrOsmXLuOSSS4DBLN9OYihGFsWOjQeKotI0ew4+nz9fhlhxKAr55nf+L/6ciVw5igEn8qQ6B/t4BmSpe+yE5CSUkco7FoPZ6/VOiYEIhZOWqqpy9+T5558vOD+ZKCvCgMEO+swzz2AYBtOmTQOQUse7VWVzpFJAsfLEzpBd6rIr8MZaN03Tiiph7bsCo4HYpj4W32qqSRh2VFdXM336dFKp1JCdncnC1G2tcUJ0ShGfwTAMubvR3Nw86Qw9Vtg19GKWts/a44Fdu+/xeAr0OI888gjxeFzaeozWsKizs5O3334b0zQLthFzuRw33HADTz/9NJAng5HITxhA2es60XAuRacaLMsiGAzS09MzLhI/Wig7woB8wwpjoqamJiA/k0wl8XM0sA8ooXOZCC25vQPGYjE5aHK5HD/5yU/4x3/8Rxl6bzSEYZom//Ef/8ENN9xAR0eHrLtlWezZs4f//u//5u/+7u8wDEMaIw0H8Y7FbGBEvSfiO07lvqAoCh6PB6/XSyKRKJACJxNlRxj2mePd7G5tt5h0Hhf6h/HCrpfRNE0ef/rpp9m0aRP33Xcfzz33nFQSjwZXXnklqVSKCy+8kEOHDsnjjz/+OOFwmN/+9rcFthyj6fzHU0axYhB9oNhO3mSh7AgDRm/LfzSeKwzBxnuv0+jKCacydrwQZQjT6RdeeIHPfOYzfP/73+emm27i2muv5Q9/+AOANOu2D2DxnvF4HIAlS5bw5JNPArB582YANm3axK233so//dM/ccYZZ0irxs7OTmkmXkFpCCX9/PnzpwRZQBk6n4lGzWaz+P3+SSEOYesxVojZBEqLyxNh7We/V9d1XnrpJS677DKuv/56/u7v/g7Lsujs7OSqq67igQce4LzzzpNGQwJi9lu6dCnLli2TZugLFy7k3nvv5d///d/ZtGkTvb29vPnmm1xxxRWYpkk2m2XmzJnceeedJYldHBtvO5YLgsEguVxuyixHoMwIw27e63bn/TWcJs1TGZOhsX/ttdf4/Oc/zwc/+EFuueUWOZP96Ec/wu12c8kll/DZz36Wn/zkJ3LGg0EJ5eqrr6ahoYEZM2awZ88evve97/HDH/6Q6upqrr76atatW8ef/vQn/vVf/xWARCLBaaeddsy2Td+tsCwLj8dDW1sbiURCHpvsflxWhGG31PR4PAVelMNdbzcJt+8gOM2TR/uxxvNRh7tnosyYBRnE43Heeust/vjHP/KDH/yAG264ge985zvSBL63txe/388tt9zC/Pnz+eY3v8nGjRv52Mc+xqpVqzjxxBOBvIParbfeKsvfv38/P/7xj6WC0+12s3nzZt5++22uuuoq0um0dAg7kveYSJTyLZkKaG1tlS4LUwVlRRhQ6IA12nWf2H0oVoZQno5GZzAVO50d4n1+/etf8+Uvf5nq6mq+/e1v09raKkkAkF6ZbrcbVVX56le/ytNPP83nPvc5Vq9ezeOPP15SOhDtbXePF0Rsd/muYGRomjblCLbsCENASAj2yEsCzoZ3GhuJn2+88QYrVqwgnU7LGBClypho2J8lCOtIRVJx72WXXUYmk+GKK66gqamJPXv28IlPfKKgbPHMvr4+TjjhBD772c/y2muvMX/+/AIjL1VVpWER5O0u2traqKurQ1EUmeBIEHA2m3fpFwOh2PtMpmPYSBLHsewDwl0+Fosd1eeMBWVFGHYdhqZpQ0Q5uyu2/XonRKfI5XIcPnyY2tpaID/z2o2KjjZEPeLxuIxzcSS7I+K+2bNnc+ONNwJw+PBhGXfCbvfQ29srI2eJeJ1nnXWWlMSSySTXXnstPT09dHR04PP5OOmkk0in01xxxRWEQiEMw+Cdd94hkUiwevVqGbOjv7+f9evXs2DBgqL1TCQSBV7CRxMj9YFShHa0yUJ8C7GTdayeOxLKijDsSKfTA2HYBjGWDqiqKqeeeipQaBkJx+7D9fb2EovFCIfDqKpKJpOR8TQmCjfffDPr168nFArJgDAiPkN9fT2ZTAbLygessSMYDPKZz3yGzZs3M2fOHDweD7t27eLZZ5/l5ptvxjRNcrkcd9xxBwcOHOAf/uEfpESyf/9+GZ2qWDuKKGKTMUDsk85w1xyLelmWRTgcLjDfn2yUFWHYZwUhMh+JCGkXuy3LktGiJurDFZvF7KbgqVSKqqoq+fxUKjUhEo69TTweD7Nnz+Yf/uEfSCaTVFdXc9JJJ1FbW4vL5eLnP/85N998MzC4zLOsfI7V888/nwsuuEDW/6677mLRokVcdNFFdHR0oKoqGzdu5A9/+AOXXnppwfs629F+TixvSoXvm0w4CWWk+gh7FaeF7mjuSyQSBINB3nnnnSmzo1RWhAGDH9LtdhdERRrLDof9HqfCaSI7bDHyMU2TdDpNMBhk1qxZBddWVVVNyPNF8uRoNEo4HCYQCPChD32owKJQSFNLliwpCCcnzonYlqI+3d3d3HbbbVx22WUoSj6KVH9/PwB9fX1j6vAj7Rgdiy3ZiVRwZzKZApP40SrQs9msjBdqjzs7mSg7whBwuVzS0WmqopTRUqm4EmMx1R4OqqrKpY2w4rQ/yw77sk6cU1WVYDAo7we47bbb6Ojo4NprrwWgtrZWSkN28/ORMFUkiYmCZVlDMryP5t0URZGOkzU1NaO+72ijbAlDeExONiMXw0iDIhwODzk2HgnHSTr2tvB6vUDeM/TgwYPccccdZLPZIVvK+/fvH9b4zTRNHnzwQe68804uu+wyli1bJtu+pqYGy7IKgiOPBPtWrPPdx/r+9nd3/l5aD2G/1v53seuHI+/B72WPwzKWOgtvayGdTAVjt7IjDDFDizXjVEwSPFzHEfqK0V4/EoQ5tnBjh8HYkSIKeW9vL2+99ZZca4tnWpbFpk2bCnQ59g5rGAZr1qzh1ltv5cILL2Tt2rVAfjkYCoXkNuponMjsS0m7/Uwxohxve6RSKbLZLJFIZBivX2vI73myLGWmXow0Cren7YRbTKk63PsIr2G7bdFkShpTbzRNAERk8KnisGOH/aMfiw+vKMqQnRVVVaWOxzAMbrrpJr74xS8WEIKIu/H2229z7733FnhOivOWZfHRj36UXC7HmjVr5HOE7scwDBYvXsz/+3//b1T1FBDb15qmTeg2tlDWOnfPCq5BAVvaKQVlwGp1fH4tipL3CBY6H2d9husDIrK92KGqLEmOEkzTlDPVaMVh4UVZW1t7zKWSI5EoSs06I5UhyOHHP/5xyVnc5XJx0kkncdJJJxU8S9wPcNJJJ3HrrbcOCfIi7r/++usl+YjjI9VNkIRYNk0UQqGQ1L0MVwcpECkKlgUu9+DyyPmt7H8Wtt/g8ba2NmbPnj1kArMbFzotlBVFobq6GsMwCIVCQwwRJwtTb4F/hLBnuRIY7QAUOUInGmJ2tn/0Ylup4ykXRrerYIcYtGJQC/JwEobzv71NnXEanPk47J3fvhQq9Z7O5xSr03hRrOxS5ZoWGOSTQJgW6JaFZhgltRWWBaaZl0Usq5BAxLObm5uHWBybpkl3d7fsr5ZlFUQjMwxDpqbs6+sraNPJRNkRhmjYTCYzpvuENvtoiX3Dzazi+FjrbEcpSUpR8lnQxqJ4HA2c77J582b6+voKjpmmSTwelzE6Dx8+/K4IipMPAKRgAVu2bOXBB/+naOaybFaju7ubRCKJouSlirzCt/AdxbcX+gihVxJLFUECW7dulWb2qqqSTqfp6uoiEonIciYbZUkYljWYps/j8Yyqk8bjcf7v//6Pw4cPj/vZpRze7DNcMbS1tdm2Ui0G5jfH/6GwlyniJoj/9jgK4wlNOFKAG2d5jY2NQ3QlbrebqqoqScT19fXous7BgwfRNI1cLkcmk+HQoUMFde/p6ZE7LcXqICSaVCo18TOuafLWm2+CaeBWFKrCIc4/71y5TLUsi0wmM9CuHnw+L62tLbJN8lnxCoeVaCuv14vX65UpLmtqauQ5VVU5+eSTCYfDBd/U4/FIBfJUINuy1GFAvrFVVZU5HUZCMBhkzpw5ExK0Zaya7OnTp0t/DaFqGwuEYjOXy+H1erEsS+pwiik9R1vmaI8riiKdzUpdK8jN5/NRV1cnZ1ZhmGRvM6FnGGlb/GgE2FFVlfPOPRfTMHC7XMydM2fIO9kTHwWDQRYsmG+7v3gbOJeggNwuLdWmBw8exDAMli1bdsyU5COh7CQM0fHe+973YlkW27dvl9m+h4PL5aK+vp7q6upjUMtC2HdNjqRT2BM1wZGJsHb9xFiuH2097dHPnXUV7vAjKfjsthoTBcuy8Pv9wwZbdupnRI7esWCkttq0aRMPPfQQnZ2dLFu2TNZtslFWuVXtr9LR0cH8+fNxuVx8/OMf5yc/+UnRrS3n/c7zxfbNYdDC0a7MKjbD2kVJe1mlkgQ7lx/54wqmOZjW0d5hRbnFAv7Yich+bXd3N36/H5/PVzBLJ5NJ2tvb8fl89PT0yOclk0k0TaOhoYFUKoXL5SIej+NyuQiHw1RXV9PS0iKlnPr6ermt2tfXR19fH16vl5kzZ8qgRr29vTIqmoid0dPTU2AZGY1GCQaDdHd3o+s6DQ0NdHR0SBf5xsZGUqkUqVSKuro6Ojs7ZSb3pqYmmYy7oaEByBNMb2+v3C0p1pZ2Bz/RrmIXQ+gx7OEO7NeI/iDKcvaZ4ZS/9v6zfft2rrrqKvbu3ct5553HQw89NKwSfyLtdoZDWSdjtiyLO++8ky996Uvous7ZZ5/N9ddfz/nnn09PT49cKx4+fBjDMPD7/VI55xQfxd9iUGYyGQzD4JVXXqGrqwtd1/F6vdJS0mlnoes6jY2NvP3222zbto3TTjtNBpMRzxiMExEkk0nT1dVNd3c3zc1NtLUdora2jp07dzJ9+nQOHDhAIpEgmUyycuVKgsEgGzZswDRNpk+fjqIotLW1leyYYrnm9XoLZnld16X/glinK4oiFXU+n6+AmMTg8Pl8JJNJmd5QbIsKRV8mk8Hn89HY2EhXVxeKosi2ElJRdXU1nZ2d6LpOfX093d3duN1uvF6vJJRgMEgymZQBicPhMJqmYVn5HB79/f34fD6CwSCLFi1i586daJomUy8Gg0G6uroG9AyDQZPEO4i61tXVSQWuWEZpmkY0GmXlypU8//zzNDY2YlkWF198Mb/+9a858cQTef3116mqqsLn8+H1elmyZAkNDQ3Sicw5+WSzWbxeLzNmzODw4cNks1leffVVtmzZQl9fH4sXL+Z//ud/mDdv3ogT3bGw7Sl7wjAMg3vuuYcvfvGLpNNpTNNkxowZ9PX1yWS//f39aJpGMBiUsRPtmmvRYZ1Rs8WWpNAZCItGIUqL2Uj8LQam0IDbFXpDCQpAIRqNkMvlBgZX8W3UUCiEruvMmjWLRCIhrVybm5vp7u4mEolgGAbBYJBUKiXfe9u2bWQyGZmXRLy3qK9lDXpZ2mdGVVWJxWLs2bNHGkApyqDfg12aEe8q4pLYB4xdAnK73dTU1NDZ2SmfYZ+9hZGZfea2Swdut1vuAonyPB5PwQQgiC+RSJDL5TAMg4aGBnm8r6+Pmpoaenp6JGEIyUjTNPx+P5qmyW1OZ5oHQaqijuL6YopKQWCJREK2bygUIp1OS4XoRz7yEb7//e8TjUZHzEVTkTAmAHZjoRdffJG1a9fy2muvyaQwdvHeHmhHUfLxQMVgaWhokPFBs9ks8+bNY/HixViWRV9fH4FAQM6oVVVVZLPZgu1Rt9tNdXU173nPe9izZw81NTVUVVVJD85AIEAsFsPj8eByuaSir6Ojg61bt7J48WIpNdghPlsoFGL9+vX87Gc/Y8aMGWQyGVwuF3V1dbS3t5NOp2lvb2fJkiV4PB5aWlro7+9n4cKF/NM//ROnnXaa9PlwuVxSfyB2A+zLFrG8siyLyy+/nNmzZ3PbbbdJAhQz92Qp5wzDoKuri5qamoJ6iLbK5XJ0d3eTyWTIZDIsWLAAVVXJ5XLs27ePGTNm0NPTQ319PX19fRw6dEi+mxjQM2bMoK2tTUo2QmITE4joS5FIRKZgcMI0Td555x2am5txu92k02l0Xeedd96R33vVqlUTbrh2pChrwhAShn0mg/xMIMTU0WjZ7bNaMYWifba0n7fPyvY1rv16IXk49Qz2+0RZpQahZVns3LmTk046iRUrVjB37lzOOussnn/+efbs2cOXv/xlnn76afbt28e2bdvQNI2HHnqIM844AyjcaSimyXe+i2EY9Pb2smrVKrLZrHROs7fLZBGGaDOnAtmpUygWvtF+n4D9m9iVnKOty0hxT0X59t0g8ZyR9G2TgXvuuad8t1VhsKPbO47YCy8mxjkHbLFO5xz4xQikWD2c1zmJxVmXYvV3nhed6+DBg1RVVbFt2zaamppYs2YNwWCQefPm4ff7ee6550ilUgQCAR577DFOP/10uYwoVr69PYo9e9OmTVLJ+frrr3PCCSdgGAaRSGTSt/6Gi9Ql3qnYRFFMWen8vnbltXPyKDahDKdXsD9DLIGdy7GpiLIljJFmulIdqtR5ZycrVXapwT0aFFt2iI5n93p84oknWL9+PZs2bWLLli1omkZjYyOZTIZLLrmEeDyOz+ejq6uLL3zhC3R3d3PFFVdw++23E4vFZMccyWemWH0sy+J///d/Oe200+jr6+O73/0uDzzwwKRKFgJOMnYeL3au1LFiKCWNib9H++2LSTITiWK6rolC2RJGuUA4xd15553cf//99PX1yd0E0zSZM2cO8+bNY9u2baTTaTZs2MB73/teHnroIfbu3cvSpUt55JFHWLp0qVR4jheKosjkyg0NDcTjcV566SW5g1Gmq9t3FZxL4IlGhTCOIZxa/mK2E5lMho6ODt5++22efPJJnn/+ebq6uujs7JTr2kAgwIoVK7j88su57rrriEQi/P73v+ev//qv+ctf/kJrayupVIpLL72UO++8k2g0WqAnGcvM41ym/ed//icdHR1cdNFFbNiwgZaWFjZu3Mhpp512VDppJpORpu3HWoKxv/tkS09TBRXCOMYQCi6xTajrOplMhpdeeondu3fz+OOP88wzz8hlg8hZ+olPfAKfz8dFF13EsmXLmDVrVsFOwDnnnCND+8diMdauXcsVV1whzawFxtrx7Wt30zR5+umnicVinHjiiei6Tnd3N48++iirVq2S9igTicnMr2qaJplMRkpP7wbSEDqRo1Z+ue6STEXY9+63b9/Ot771Lfbv3y/9XewSx4IFC7jooou49NJLmTVrFgsXLpT3igFs16QnEglOPfVUzjrrLNauXSu3R4+089iloj//+c9cfvnlnHzyyRiGwe7du6XV6FtvvSUjjU/kwJrMWb7UztjxirLfJTkWKGb2bd9REVLEG2+8wZYtW3jiiSekktC+9Xb++efT2NjINddcw+rVqwvud3bUYsdDoRA//elPOffccye8g4t3Wr9+PalUiuXLl/Poo4/ypS99iV/+8pfs2bOHrq4umWvEOdBEnd+NON5JwokKYRwh7PoI+2yYzWb5t3/7N3bv3s3vf/97LCufBFlYJk6fPp1FixZxwQUXcOGFF0rDqvHuxgCSaCa6k4tgL7/97W9RVZU5c+bQ1tbGD3/4Q0455RS2b9/Od77zHe6++265Zd3X18eDDz7Ipz/96SN69mQO2ApZDEWFMI4Qwp5h//79bNiwgRdeeIE///nPJJNJWlpaqK2tpbu7m/r6es466yzmz5/PjTfeSHV1NVVVVQVm6BO1Ojwa6+1/+7d/o6Ojg1WrVnHOOefwj//4j5imySWXXMKLL77IE088we7du1myZAmqqtLd3c3GjRvHZOxUwdRHRYcxDOypEQXEAOjq6uIPf/gDLS0tvPjii1JRmcvlpPv2hRdeyNKlS7nwwguZPXu2TGQsyjkSmwAn7DYbR1JOsXLj8Tgf/OAH2bp1K36/n0gkgtfrZf/+/TQ2NlJXV8emTZtYu3YtH//4x4uWMxVm66Npn3CsYLdWPdYK4bI2DZ8ICLNd8TOXy/Hwww/z8ssv89BDD9HR0SGvCwQChEIh/vqv/5oPfOAD1NTUsHz5crnMsPuvvJtgWRbr1q3j05/+tPQrMQwDn89HIBCgr69P6mmmT5/OX/7yl0mJKTIalAthGIYhfV6OJSqEMQIsy+KNN97gpZde4he/+AV79+4lmUzi9/uJRqPEYjFOOOEEzjjjDC655BKCwSCzZ88uCMU/GlPwqQzRQdva2mhsbERVVXbt2sWyZcsIBoO0t7dLV317PpipCHtXF85y7zbYlcqTIWG8+1rsCOF0N7YHSDFNk23btnHXXXfR0tLCY489VuCh6fP5OP3002lububaa6/lggsuGDbq02TaEEwkXC6XzPMq2kLXdZLJJG63m5dffpmZM2cyY8aMKfnOxZZ/Ytk43I6SfXBOpHRYzI9pLBjOiM1pHDjeZ5TCcUcYdkMk0Rl+9rOf0dLSwvr16+nu7qazs5O6ujrcbjexWIwzzzyTL33pSxiGwcqVK2UWsXIQcUeC/d3sW8Yw6FQ3b9486VI+1SHexzRNdF0vCGRUCkdDCB9v3xnN9SMpvY/EtqWsCMPZEMU+dG9vL889DYSaigAAIABJREFU9xybNm3i8ccfp6+vj3379uH3+8lkMjQ0NHDKKaewcOFCbrzxRhoaGoasFZ02FMcThLdqIBCQxNvQ0DDl28KeBnKsOBpLFzthmJaFInKxApYycG6MwaAFFCWfbS2bzcrIcnYSEW0xnomurAgDBgPniA6s6zobN25kw4YN7Nu3j0ceeYQDBw7IBotEIlx66aUsWLCA1atX09zczAknnDDJbzE1ITr5CSecUJD1faorcxVlaI5dEaJwpPuOxnvZLXBNyyIHuLFQLUBRxhE3vhDC1scZIc5Zh/Gg7AjDvpvxyiuv8NJLL7Fr1y56e3vx+/243W7C4TBnn302f/u3f0soFOLcc8+VS4yKDnh4iJlK07QpFxFqqqNUz3rj9TdZsWwp/glsT0XJp5coptM4EolpyhOG/YXtEars5/v7+3n11Vc5fPgwt912G6+//nrB7BCJRDj77LM555xz+NjHPsbcuXNlozkjXk110XqyoSgKTzzxBB6PZ9ikxuUA+yArpXMoNcEUVaJiFaadscCwLP7vlVeY19SEr6aGkSb+seo+JlpCelcQhhjU9tibhw4d4tFHH2Xz5s38+te/lpm+dV0nGo2yePFiTjrpJE4//XTOOOMMSRJOMdNOEO8Gpd1UwPLly2Xk8clYitgHzdH2IrX3v5HIYmRlY5GDisLHrrmGqmBQksVodBfDGf6N1B5H0l5TnjAgLwX09/fzu9/9jg0bNvDHP/4RTdNIJpNSLG5oaGDRokV873vfQ9M0Vq5cKYPzCrxbXJSnOoR01t/fP6n1GMvy0b49OlaM5h4RCHg4cd+wTFSlMI5rPrRhOK+/GAUmuw9PCmHYlTF2k2ZnsNmXXnqJN998kwceeIC9e/fS1dVFLpcjEAiwZMkSLMvir/7qr/jEJz5BNBolEong8/lkeU7XZLtZ7VBRs7S450xaZF+NinNCwnEuoRRFkaKoJe61xAMHnyV0Ak6T38F3sORsJ+rvcrlRlMKs4MXqPxGwz1xdXV0A0tFMJP8pNQMPNzOLbW6nzUCxHa9i5TivTafTeDyegoFrAjnDkLsDLpcKFnht0dCLwbKsgujg4p3tqRPEz7a2NgDq6+sJh8NSAhNpEhRFQcvpKEreUtbjdeNSFTJZnayWJeBxEfB5UVULLAtVUSm2PinVDnYcTUKZNMKwKxkFQfT29vLoo4/S2trKU089xZtvvikbva6ujnnz5rFy5UpWrVrFRRddxNy5c4HiWvpS4prTP2Twp0kul5M5Se1pBxOJfAbyWCyW//gqGIY+EIE8NzDIVfRcVr6fKFd1uVDUvFY8l8thmRZenxdDN4HBvKemaaBp2YF6Fr5DvixzoJ100pk0Pp9vgMAG7QrG01Gc+qBS19jbS+RvWbVqVcE3dMIeZNhOOE5SddbfSTTDKaOLDRbn9Yai5BtVVbEAw7RQlcJ7ncsccUx+N2swCbOqqmQyGZnXRtwnMrLncrkC4hLuBalUBlXNl6ek8tns4okEPl8QNegDxSIU8IFlYVkmijJ0iVxq2ZzNZnG5XEfdenXSliSaptHe3s6mTZt44IEH2L17N1u3bpXJY3Rdx7IszjzzTK655hrmzp3LOeecAxSXSsYCe4caTDI0OLMLUTF/bT7WhEica1kWpg6K4sHj9uBxDx5vbd1PYCCD2qFDh+g83EkoFGL69OmkUmmZrSyVSg3oZISfSp5wampqZAQu0THT6cyAuGuBMri+NS0LLAVQJGE6XezH0hZiJrQfd4a+F8deffVVamtr2bFjB//xH/8h0xm2tbXR3t4uY3L09/fz5ptvEolEZBTzHTt24PV6yWQy1NTUEIlEePPNN5k+fTo1NTVEo1E2b97M4sWLSafThEIhuru7qampkb4sup4na7EL4CSaoRi0cUCx6xKGSmX24EQiG55IyCQcCwOBgEyV6Pf78fv9zJw5U2akmzlzJrlcjtbWVpqbmxFWwtFoBEM32L1tR15CBmqiDRiWgjXQB3O5HB73oOQ41XBUfEl0XR+y8yA63LZt23jnnXf4wQ9+wJtvvklVVRWqqhKPx4lEIpx88slMmzaN6667jtWrVw8pQ1Z8BIlCDAIhvTz44IOsX79eipCaptHb20s0GqW1tRVNy8o8Jlu3bsXlcpHNarbyRbngcrlRVZckNfl8y5DXFsxUtnrls3srBaSUP65iWebAufxzLAs8HveAVeLgtfmwfX5AlSkW7W0TDocBSKVSQwZRMYJ1KvbE1rPI4RIOh4nH4/Kdpk2bRiwWo7e3l/b2dvx+P4lEAkVRpOIZ8oPP6/VSXV1Nf38/yWRSHhM/NU3DMAypixJkKdrUGf5f1FHkcRX10LT8twoGg7jdbvx+P319fXmytcAf8ONSXfTH8xKB2+1hdtNs9u3bJ9+/vr6erq4uTNPE4/EUZFPzeDwyu5umaaiqit/vJxaL0d7eLvu3XTIV9Yd8Xtd0Km9KHwgEiMfj+UlIUUgmM/j8fjQtS119LZdddhk33XgT8+bOHaLELCVFHu0lKRwl5zNh0CMqHY/Hufvuu9m2bRtvvfUWGzdulI4/mqZRW1vL+973Phmr8pRTTilIuWdv9LHWwzRNduzYwRe+8AVeffVVmUpQvLIwbhnUdwxKHKKTCPIrFF/B5XZh6DqgDA50bKItoAzU27ANRjErmqaBx+OhqiqKx+PlwIED+fsUqK6ukWn9mpubSSQS1NTU0t/fT3d3N5Zl0djYKLOuiXSIop3EsqpYmr7BdygU+8VM2dPTU9DhhK+MfblmWRaRSEQuTcQWay6Xo7m5mb1798p+sGzZMjo7O0mn06xYsYJwOMzLL79MLBbD6/WSTCaZPn06hw8f5uDBg9TU1JDL5WQOVq/XKxWKNTU1QF6H4vf76e/vl9HTo9GoDFAkMDjZDMzgA++tDDS0YlNAiknJ/rezP7W0tBCJRHC5XHR0dFBVVYXH45EZzlKplKyT2+0mEonIJZxpmrjUPJkYup4fI6qKqigEAn5SA0mqvT4vLrcbv9fHpZdeyo9//OMh3r+TpfQ8Ks5nYmD86le/4jvf+Q65XI7Ozk4Z+La5uZnp06fzyU9+khUrVsh4CnaFIRy5/b6iKDz88MN8+9vfZseOHcyfP5+zzz6bRYsWDcmLme8o+VnO43GTTCaJRCI0NDTQ29uLYRgEAoEBhVaEPXt24fa48XjcVEWriEQihMNhVMWDoecHrs/vx+/zDVjuDYrNg0lrTFRVkRGxk8mkHIxCryFmd1038PsDcm1sWfkM52LN6vf7h4SWt89yxWAX5YspHZ3XlrpXQBBWqeWBfQL4+7//+yFlFJMixN/OCcPpNFYqa5m431LMwXJtW5aWSUE5Tj2GvTzDMGTCaZHe0J4nV1wjcuzaLUmFFKWoLkzTIq/Azl+joOBWIacbKIrKoY5DfOOb32TTxk08/PDDrFixgi9+8YuyzMne5ZtwCUN0+ptvvplf/OIXXHnllfj9fhYsWEBtbS0XXHABtbW1o37xsTSQfa3d0dHBWWedRS6XY/Xq1dxyyy0yR6l9bT6WsoV+IZfLYhg6LpdbiuC5XA7D1HC7XaSSKQDCkQjhUBjDMEmn0yiqSlU0Sk7XMQ0GtO15actpI2JZopMP7SSlTLJF9nLndrL9HUZqz2Kzq7MM+7XjKeNYoGQd7FUeZRVHm+fDrucpRjipdIb+/jipVIpoNEIkEsmTTyqJ2+3C4/bi8eYllk996lM89dRTNDU18eqrr8pJZDJJ46i6t+cVdmn+P3tnHh9Vdff/9519y76SQMImIggquAIuoFZ4QCutuD1gqVqt9kHbWl8qtP60hVpbtWofW22tj6it1mor1orFWgWRqlCQRdkhQZKQdfbJrPf+/hjO4c4wCQEySYB8Xq+8kszce865557zPd/9e/7553Pdddfp2H7loNOgOyH6eeSRR9i7dy9z5szhsccew+l0dlke7KhdcZo7HEkTYiwWk5tT0zRULYFBUSgUHOT+9k3mJNcgzKsWsxnNZEBRDJjNHfkHpM5T+okbjUZl8WTxucvlSimvmH5qx2Ixeep19uyH4kqCwSBWq7XT0P7ePgm7NIYuDjH9HRzutUIv5HA4sNvthMOR/dysETQw7/eYFWKkw+HgN7/5DZdccgm1tbXcf//9PPzww31iTrNCMPSmLb0PQzYrMun7VlWVVatWkUgkZLxIusx+JO2C3g9fw2q1oWlCOQeoB1P/pHlsfxsAiob+4NMT0I5O70wK3kxOaZ2ZGIU+4GihadpBtU6OVxypDi1d1JLtKEm9ltNhSzI3ycUj/XH0lrvi4mKGDx+O1+ulpaWlTxALgKzsXqEU0zSN5uZm4ECEXja5C4H29nY2bNiAqqpUVlbKgkBHWyZQ/E4uIiOpXMDBFcyV/Yo1/XWKYpCyb3rbmfrMRCwycWlifjO1kakmaCKRkD+Hg3TrU2K/Q1R8vyKvt0WR7kR3r1P9+jAoCgZDkogIMUO/ThVF4YwzzsBkMklrV1+Y26xwGJqmYTabpekMepZF1VtpBLqj/0O1qSjihaZzCpkJVfqQjmaMXdFNCAgLkhCzDgeaptHS0kJJSYlcwKIyfF85BXsLmZ4/lagfwk8k7X5VVXE6nezdu7fPzG23cxhCxrbb7WiaJhWNPUUdBbESRKO7+k2n8HoF6yHu7Jb+Dxf68aX/ADz88MP88Y9/lHOU7vTV0fNt2rSJ8ePH88UXXwDJRT1z5kx+//vfH9SP3mTd1bH1lZO0tyHEGL/fL2vj9gVkxayqaZq0Tefn53d3F51C0zTJ1nUl/dqRtN+xPqRveOcJR65HHnmEQCCAxWKRZQF+9KMf4fF4ePzxx/ntb3+L1+vFbDbj8XioqKiQbSQSCdra2nj++eflZ5qm0dbWhslk4m9/+xtLly7FYEg6j3300Uf4fD7p3KRpGpMnT2b8+PHAAZdmYW1KJBKsWLGCzz77DL/fz5QpU5gwYcL+WI/jNWq46+tDrK1gMCjnqy+kXsgKh6EoBzzjmpube/zEaG1tTVG4dhfES9R7I/ZFiE335z//mUgkwumnn862bdtYsmQJmqZx9913E4lEuPvuu5k4cSLnn38+kyZNoq2tLaWdaDTKG2+8wc6dO9m5cye7du1i165dtLa28vnnn7Nz5062b9+Ox+Ohvr6eXbt28d5777Fr1y527tyJ2+0GMvt1LFq0iOuuu47333+fJ554gv/6r//iwQcf7LE56usQ+8hut1NfX98jur+uoNs5DOHIUlRUBPTs5hKKo8LCQsxmM/n5+Smuup1ZSrriXyCuEXEl6Z/3hRcKqU5QM2bM4MILL+S73/0u999/P8888wyRSIQvv/wSl8tFc3Mz5557Li+++CKFhYUptWIrKipYsWJFyhxu376dcDjMs88+KyODf/e73/Hkk0+yaNEinn76acaPH8+NN94o20m3GmzdupWXXnqJlStXMmLECJqamrj44ot55JFHuPbaaxkzZkzPT1ofg7D2tba2cuqpp8p6ML3NfWVNh9HU1ISmaTIEuic3k8iV0dTUJOMauoPLSRdH+gqBSIcMq98/3nfeeQdVVamvr+fRRx9F0zQWLFjA7bffzpQpUwgGg6xbt47vf//78r0J9relpYWnnnqKpqYmHnjgATZt2sRtt93GBx98wLJly3jnnXeoqqqioKCAX/3qV5x77rn88pe/5MMPP5TWoPR52rVrF//v//0/TjrpJIxGIwMGDGD27NlHZLU5XiH2jIiWFSEKvY2sWUncbjcGg0E6TPUExGYWPgrpvgqHGkdnhC0YDHZoCdBzMH3hpeoRi8W45557+OlPf0pFRQXFxcUpBGH06NEYDAaCwSAvvfQS06dPZ/LkycCBfBD33XcfV155JU8++ST33HOP5LD09Vy8Xi+tra20trbyla98hR07dnDhhRceNB5FUZg+fbr8W0DoWdK5txMdxcXFFBcX96jhoDNkzdNTaHb11oqe2Eyapskow2g02uU+hQ9BR2ZGh8NxSFHmSCHaECxnd85TIpGgrq6OyspKLrjgAoYMGcJzzz0nvxd9OZ1O8vPzZfTwgSQ9yRNu2bJlDBgwgK985SvMnj2biooKBg4cyOeff04sFsPn83HNNddw0003MXPmTO68886M40l3hBJc0Oeff86ll36F4cOHo6ra/qje7hX1xDyLRDp9QYnYGYSCuCNdUG8gKwRD1H4ECAQCHbg+Zw+BQACXy0UwGAS6Jj4cyh+ho/F353NlQz612+288MILzJo1i1WrVgFJvwk4ID4K60dzczPhcFjeKziH8vJyHn30UUpLS4lEIgwePJgFCxZw00038dBDD1FZWcnjjz9OKBRi2bJlbNiwQeqwMiE9s9r69et5440l/POf75GM/hVEODsbJBqNytiMvgxFSeaxFekKjluCoSjJ7EP6076nOAyRCCY9f8aJjKlTp3LllVdyzz338NxzzzFq1CjOO+88qqurqaur46OPPsJsNvOPf/xD5pUQJ//w4cPZvn07wWCQ//7v/0ZRkjEpe/bswWq14vP5sFgsXHDBBbL27KxZs+Qi7wyCYFxxxRXceuutDB8+jMbGJkpLS6XXdHdD07RjSuwJBoPU1dWluJj3JrJGMES1sJ5WYhkMBrxeLx6PR36WKcYiHXrrQG+9lGz0K0SAr3/969x88818/PHH3HHHHUybNo0VK1YwcOBAhg4dSjgcJhwOk5eXJxfn7t27mTdvHg6Hg127du3PHBZi3bp1vP7664wYMYJnnnkGi8XC448/ziuvvMKGDRs6FEcExJqIRqPceOONnHfeedx33300NOyjomIARqOhW4lFpvR/3Y0j3cxCFNZne9P/Li4uPiiUoDeRNaVnfX39/sjOzLJ/tqAoCnl5eUCSHdc7b3X2UlVVJRQKydJyPYls9ycIQDweZ8yYMdTU1LBhwwYURaGsrIyf//zntLS0sGXLFs444wxJZCoqKjjllFP49NNPmTZtGuvWrSMSiXDRRRdx6623ArB69Wr+/ve/k0gkWLVqFUOGDOHiiy/usDq6GEt7eztz5szBZDLx8ssvYzAYGD58GBs2rN8/hu6fA8he6P2hzPYd4VCEoKmpidNPP71PcBeQRaWniCERLuI9SSGFfOpwOKQPgcjH2JGeQLizH2+IRCJMmDCBXbt2ceWVV3LLLbdQUlLCq6++yh/+8AeuueYaBg4cSEFBAf/zP//Dyy+/zJVXXgkk53HAgAGMHj2aQCCA0WiUeoqamhq2bt1KdXU1NpuNvLw8KisrmTx5csqJmQmhUIj/+Z//oaGhgf/93/9l7dq1BAJBXn/9dd5//wPWr/8Mi6Xj0PkjhdfrJT8/n0gkQjAYpLi4uNva1nOoh7u5O7vebDazb9++45tg6OMTBHrygcXJFg6HZV7KeDzeKdFKJBIHpfg/VpEej2E2m1m8eDFbtmxh1apV3Hfffbz++utcdtllTJ8+ncGDBzNu3Dhmz57N3XffzaRJk6RI+fHHH1NaWkpjYyN5eXn4fD5mzZrF008/zYwZM/jLX/5CPB7nz3/+Mw0NDfj9fpn3UryH9IjZ7373u/zjH//A5XJx/fXXS+V0KBRi4cKFmM3Zy02dSCQylkQ4WuhFicPhYA7lJCh8VfoCsYAshrcLpafQlveUAlJRFGpqaoAklyPMZzabrVNiIMK0jzeYTCaWL1+Oy+XiJz/5Cffddx/btm2TG+f111+nurqacePGcdVVVxGJRLj//vvRNI2amhpWrFjB6NGjWb58OTfeeCObN29m1apVfOMb32D16tWSeNx7770sWLCApUuXsnXrVh544AFeffXVjGP64Q9/yOrVq1m3bh3r169n48aNfPbZZ6xZs0Z6iHY3hKgq1kBHWcmOpv10/cPh3pspWnXTpk0M2Z8MuC8gaxyG8PAUL6anRBKx0DVNIzc3V7ovH0qZmZ5T9FhHOByWeScVRWHhwoVMmTKFa6+9lhdeeIFEIsHVV19NIpFg27ZtnHLKKZxzzjm8+uqrcoHm5eXx2GOPEYvFaGtrY8KECVRWVjJlyhQA5syZw4MPPsj8+fNZsGAB8+fPx+fzMXXqVFpbW3nllVcyjq26ulr+LYi5OFyypV840rotvQVFUWhoaMBgMFBVVdXjYn1HyJrSE5KssLD59xRElKWoXyEWyqEmuy+7eh8uVFWlpaWFYDAos4298847cg6uu+46NmzYwJdffomiKJx55pnccccdFBUVMWnSJNlOcXExN9xwAzfffDMLFizAarUyatQoRo0aJU2ikUiEpUuX8oMf/IBAIMCiRYswmZKJlC+99NKDFJ/p4on4LJvI1OexAKE43rNnT8Y8ob2BrPphxONxKZ/21MMqiiK9TAsKCg6SV3t7wnsKAwcOZMuWLRnd2a1WK4888khKBbrOCOpTTz0lEyKlY/r06cyYMQNVVaX+4qc//WmPpGM8niH2S1lZWZ8hFtADOgwRu9BTD2swGAiFQhiNRtxut2TL9WM7USBM2h3NvT4dXGfvR18+Ug/9vUajMcWHQ6A3EuIcD0l4FCVZOa62tpazzz4b6BtrN2scBiBrS/YGZRRKPbPZTDgcTsmwfbwjk/+D/h2kOwJ1xgkoSuaK5IJQdHZvX1jgxypE4J/RaGT9+vV9hmPLGocRCoVQVTVFJOkpiBOmtLQUh8MhuYz+BdyzEKb1npp3TdOSpRzE/7qfYw2alqyto6oqkUikz4glWeMwRAZkUXi4p6BpyZyeiqJIjsJmsx01dU5ns9OfKd3+3pErcqZ8Gl3ZUF25Vn9NNpP6iIMgJyfnkNeK5zzUuDN9n/48h0xPoL82WbgSRf516P7S++0I6ZXXugvp66ekpAS73c7JJ58sP+ttopE1DkOY9bJlKusIqqpKM5Qo/Gy1WlM88Y4E4rTct2/fQVyTsBhk8uNIJwyi5mj6nESjUbnY9eHumeZOf3KLuU7/PhaLyXga0UYsFsvYv3BsE9eK5xH/i1J/4jtVTVZyU1WVQCCQUpQ6HA5n1GMInRaQMeFweh/67/RERz+G9GtVTSUWj4OioAHt4QjB9hCR/XObLGodzzinXSES4r5sigZinLFYjK1bt2IymaRuqC8gK08u5N6u+D90NwwGA6eddhqDBg1CVVV+9rOfAaQUeD4S6IOB9B6MAkLeTP88fVGLGp0iildA1FjVb4pIJJJx7hQlGfbs9XoPIhaiz0QiIU2qsViMcDhMQ0NDxmcT2cn0/UUiEfl/U1MTHo8HRVFkVixFUWTNmUAgQHt7e8qzBQIB3G43ra2t+Hw+YrGYtJwJYhQOh/F6vXi9Xvx+v2wjE1emJ8iNjY1EIhH5vSibABCNxYgnEkRiUdweN+3hMHtqa2VuFL0+Rn9fVxWlmqZ1SHS6A6Ldv/71r7S1tWE2mxk5cmRW+joSZI3DsNvtR1TD9GghnMbuvPNOPB4Pb7zxBo8++ih1dXVycYiFoj+l0k93Me5kjVMVIQ0bjQbp5KU/dYSjmr7tTGZIi8VCbm6uvD59bvRp7RwOx0GnqjipTSaTNB+LtkQhYEAWaBYmU6vVyqBBgzIqKgsKChgwYABms1mOx263Y7FYiEajVFRUUFBQIDNXm0wmCgsLKS0txW63Y7fbJQHMy8uT6QVsNivBYABFAaNRQVUTmExGuWnFdU6nE5vNRjweJxKJyILTiUSCWCyWwn0JgpNIJKivr5ebV1EUWltasVusKKqGxWRG0TRyHE6GDR+G1+tNITJirQQCAUKhkMxy7/f7pf+OCBfQc0hC+Sh0dPp1IK5P/1z/O9OP/r5oNMqDDz7IvHnzCIZCTJ48mUkTJ2FQDBiU3ld6Zk2HoWdzewp6bmbevHl88cUXvPrqq/zwhz/kiSee4Nvf/rbcMCLrknAuM5vNMlVdqmye3ICxWBxFSVa383q92O1JZWpxcXGyEPN+j0mDwUBtbS25ubnk5uZiMploaWmR+UXFhhQcz6HmKD0KUiR/EXK0yP8hNteAAQPweDxyYxmNRlRVJS8vj0AgACCv1xMsQag0LVm1TrDvIt+Fy+XCaDTi9/vlxtV7x7a3t2M2mzEajdhsNlpaWjAYktxJWVmZfNZkYOCBk97v92Oz2WR1L8FpCWKpF2UEcayrq6OgoIBQKERhYaF8pn379slQBLPZzJdffklxcTFmsxmfz3dQJLLRaJRlGEKhEEVFRbKgtQgrUBQFp9Mpn8NsNuP1egkGg4wePZq6ujoURWHQoEGEQiGam5uZNGkSZrOZ9evXU1FRgd1up7S0lH379pGbm4vX6yUvL0/OSXNzM0OHDiUej7NkyRL27NmDP+BnxowZ/OY3v8FkNqVUne9NZKV6eyKR4L/+679Yvnw5K1as4Kyzzupx0UQ4Ev3gBz/gz3/+s/Q41bsJi98ul0suWEjP4SG4hAN6iLy8PEKhdsmai0194GS1yZNK9JMuErlcLnJzc2lubk7ZFALCt0GkyNNvbKfTKdl3s9mM0+mU+gqLxYLBYCAcDmOxWCSRysnJkaei3W6XBF2cmEajkbKyMqlLEIFmbW1tGAwGBg4cSCQSSdGL2Gw2WZBa0zRZpDknJ4fW1tb9HIUZi8VMOBwhkUhgtVqIRmOYTCZJrMW8iAhnkd8zFovJk18/b6FQSMaFhEIhTCYTRqNRcieQ9EERzwtQVFSE1+slGo3KedErLlVVxWw243K5ZG4Q4aw2YsQI2traaGtrIx6PU15ejslkoqSkhKamJqxWq1xfwWAQs9ks56WpqQm73U5ubq4cT05ODrm5udTV1VFSUoKiJGvl1tbWUl5eTjgcZuq0aTz62GM47DaMBmMqwegl2pGV6u3iBBeLULC5Pa3ZNRgMuFwunnnmGZ588kmeffZZPv74YzkmcfIKhZtYpDabTb5cs9msY6sV2tvbOfPMM6mpqcVgMMp0+G1tbTQ2NkpX3oqKCkKhEMXFxXLDx2IxmRA5fT46otkST43ZAAAgAElEQVSHsh7o70+3RqTfq7c06JWwHb2X9PHp9Sv79u3j3nvv5aGHHqK8vDylv0xWEX0/6X2KzZreZyarUHof6SHlmcad/pm4R7yrTM+vqioejwebzUY0GsXv91NcXIzH46GtrY2hQ4fi9XrZsGGD1GkJIiv0OfF4nMrKSqLRKF988QVGo5H8/HyampqwWCw4HA6ptxFc4tixY7n44ouZNGkSg4cOJRKLklC1ZKFvffnNXuQ2up1g6PUENputR7OGp0MfmXjbbbdx2223HTKmIHWBgnhRqfoGBUHmxQmtX8zpCzV9ofcU9ByT0GV0xRW8IwgCu3DhQvx+PxaLhRkzZlBfX4/ZbCYvL09yOMmNAEZjsjKa1WolkVBR1QSxWDSFgIk1I5IPOxwOnE4ngFS8CvbdYrEQiUSky386ARa/hU5AtJ/urCa4yPTQ8UyWnI4IsZ6oibGLNvW6C33VN3Ffulu+/l0ZDAYiiRgWqxWDYiChqQQDAVxOF8Zedt7KCochisiGQiFpguxNdGYzz3TK6k9T0gorH/C4U+TLTm//aKwx2UCm8R1NO4IN//3vf8+cOXMAKCwsTNl8yShhA6DtF50sWK1JjwhNO6DMTd9M0Wg0ZWMLcUeIfHCgkJSiJPOLCn+bTO9RiHadPXM6ByR+C1FSfxDor0snHKLYkP47/fPpxeBMh4m4XlVVLGYLGge+czqcvSaK6NEhwdBT6EzFaDqDmBih9e0tDkOPTBGSHRGLA78PHndy8SWVn5me61Dt9iREn93lN6BpGuvXf8bzzz9PVdUgcnJc+P1eKdPr+z3Qp0FyC/p5S+fIxFhFhrb050jnzvQbO5PocShuTr8eMolCIs4m/VBIv17/mZ4AdvT+O/pef50cm6IcmLQ+Em3b4UoKh8P87ne/Y9OmTYfdqKqq5ObmShNcb0O/4NKp+5H8QGffdd5uX3r+w4fGpk0bKSzMJ5GIs2HDBl588UVMpoM334G+Dqx7/eeZr+18/uQodARFKErTubrDe5+Z5wpIsWIdqo0jXU8d/rBf+O0Da0jAoLfz639CoRB/+ctfuOKKK9i2bVvGazpT1sViBzThfYk978fhIfV9wwMPPEg0GttfhzWBz+fr9qLXXYV+o3bXGtM/r1BGdld7Xd0/me472v6FJe5IfvQwATQ0NLBy5UogVZFzyy238MQTTzBt2jQWLVqUwsYNGjSIc889t8NBer3ePhFd14+jhxAvP/roI+rr67n66qsZOfJkXnnlTzz44I+58sqvcfLJJ3dYS7W7kUk86K4+9eKRMLV2R/vBYJBEIiF9fPT7rKO2M4lahwNNS+qPlixZwg9+8APee+89qqqq2L59O5s2bUpR1qb3cfbZZ1NZWZkqIrGfYMRiMWbPns2MGTOIRqPEYjEUJelcU1lZSXl5ORs2bABg27ZtbN26lbFjx3ZIMOBAQeS+oPTsx9FBnDRvvfU3EokE0WgEt9vDqaeOZsuWLdTX13HSSScdFweEfuPo0yF0trE7g9j0et1MV9oR1wYCgS4F+XXUhqIka9nW1tZy8cUX8/LLLxOPx1mwYAGzZs2irq6O1tZWwuEwOTk5TJo0CZPJxPe//31eeeWVg96pCZJab0VRmDNnDpWVlWiaxk9+8hOuvfZaJkyYwP/+7//S3NzMt771LUpKSnjnnXf4wx/+0OFADQYDJSUl2Gy2bk+22o+eh1jgK1Z8yMiRJ3PppV9h3rx5/OIXv+A//1nLD3/4Q5YufYeCgoJeHunRI5Ou5EiJhWgvk0ldfBaLxaQeRg9xaB8psdD3bzab+e53v0tOTg4ffvghw4YN46tf/So33HADP/jBD/jrX/9KY2MjLS0tjB49mng8zgcffJDRumQCGDBgAPfddx+//vWv2bNnD5FIhD179rB582ZKSkrYvHkzVquVlStXUlpayhNPPHHIGh7btm0jGo12GEDVj2MHmqbxxhtvsGnTJux2O++99y8SCZWf/GQh+fn5bNr0uSxDcCzmzuwI3SHuZFJUpptRM0FvQTpSzk3TNLZt20Y4HObUU0/lxhtv3G/pWk9ZWRnXX3+9rEHT2NjIddddx/e+9z1uvvlmnnzyyczFqFRV1eLxuBaLxbRoNKpFo1HN4/Foc+fO1Xbt2qXFYjHt1Vdf1Z599lktHo/La+LxuKaqqpaORCKhqaqqXXTRRZrFYtFWrVqlqaqa8dp+9H2oqqoFg0Ht7LPP1k4++WTtZz/7mTZy5Ejtsssu01566SVt3rx5WmlpqXb55Zd3uCb6kRmd7QvxndhPR4J4PK7Nnz9fKy0t1Z566im5b/fs2aNNnDhRe/DBB7V4PK4tXbpUW7t2rbZx40Zt/Pjx2vXXXy/3ur7vxYsXayY9FVy4cCErV66UDiiiHJ6gVq+++iqnn346ixYt6pDqKkoyBNrhcPRotqV+ZA/xeJydO3cyZswY3nvvPRmReuutt2K1WmVpyr6SRq6nkL62u8qJaDpdxqH2x9FwN5qm8eMf/5ihQ4cyb948LBYLc+fO5S9/+QvXXHMN3/nOd9A0jVdeeYXx48dz2223sXTpUv7whz+gKErGLF8mRTngmltdXc3KlSv55je/mcIKiYXw3nvv8ac//YmHHnqo0wcxGAx89tln5OXldZuWuR+9g2g0ypw5c/D5fHzyySdomiZjbkRUZ0tLC2+//TaLFy/mpptu6u0h9yhEAOLhEMpMVp7OrjlSCK/Rb3zjGxiNRoYMGYKmaZx88sm0t7ezZMkSqqur2bdvnwzhECUzP/jgA84999yDdJAmTTvg0+9wOKiurubrX/86qqpy6aWXMmbMGH75y1+iaRpffPFFlwfrcDjwer3y/3RK1Y9jA2azme9973tSya2qKg8//DDPPvssv/rVr5g6dSpmsxm32019fX0vj7ZnoaoqPp+P/Pz83h5KRmg6Zevs2bP54osv+Pe//80vfvELydns3r2bxsZGVqxYwdNPP01paSnbt2+npqaGl19+mZkzZ6a0aQIk66FpycSjkJwMr9eL1Wrl3nvv5cc//nFKUaJDsWMOh4NYLJaS4KQfxxg0MCgGLrzgQlAOOG998MEHtLa2snbtWq655hoUJZkzYuDAgb094h6FwWA4JixDQoJYsGABV1xxBf/85z/lXp8+fbpMNvzYY49xzjnnyCja0tLSg9oy6BvcuHGjzAuxZcsWtm3bhtPp5Nlnn00pZqzPC6lp2kGefoqSLGSkT+3fTzCONcRJ5gIRpxQoSvJvUUqxoKBAnmA95bTVl9CXXLY7ghCZNm7cyEcffcS0adNQVZXm5mYuv/xyrFYrEydO5MILL+S2226jtbWVgoICKisrZTJtPQxwIKz4/PPPZ9q0acRiMR555BEGDRrEuHHjOO+883A4HMyaNYs5c+YQjUZ5+umnZUq4TJMVDocxmUwdpqLrR19HFJQYKOr+GDwD4hUKZXZ3umT3o/shCHk8HufnP/85c+bMoaysjJaWFu644w4aGhpYvHgxFRUVXH311Vx99dXcd999B+Wb1cOgb3zKlCmMHz+e22+/nbfeeovf/va3Mu+BoiicdtppPPjgg9TW1vLd736XzZs3d0gMkh6BUZmPsa9S4H4cgOAWo9EoDY11hCMhkvlMkxAK8s2bN2MwGHA4HPK+fvQ9iL25du1a/vznPzNr1iyWLl3KjBkzWLNmDX/9618ltxiNRrn77rsZO3YsN954Y0quUT0MwWCQO+64g9mzZzNy5EguvfRS/H4/y5YtY+LEifj9fpYuXcrvf/973nzzTe6++25uuOEGBg4cyNixYztkQ0Wyk/TEJf3o+1BVlVAoTjAYRdOEY9GBFIEul4t4PC7Ty/UfBn0TiUSC9vZ2vv3tb3PllVdiMpmYNWsWRqORpUuXUlZWJg+JSCSC2Wxm3rx5XHDBBVx99dVpqSqTMCmKQktLCw0NDcydO5fp06czZswYyW7ecMMN1NXVSS25oijMnDlTdgwd299F4Er/gjp2oCjJRLvVg4ajKAbQlCStUJLJhDQNSktLMRgMKblG+99x34PJZGLHjh1s376dhx9+mDPPPJO///3vnHHGGbhcLtxut8yOBgesKjfeeCPXX389JpPpoL1tcjgcvPzyyx126nA4+MlPftLpwDK5two2R5+yr5/T6NvQxz2YTCItgSAECmBE0xLSqtbY2NhPKPowNE1j9OjRrF69mmHDhmE0Grn44ovl92VlZSQSCd5//30mTZqUso9F0qP0vW3K1gtXFAWbzSbTwPcvrGMDHTsVJdPrGQwG2traAFLS1/Wjb8JkMjFy5MiMqgPx7lasWEFhYWGX3mNW02EZjcmiNXqv0Z5ER8q4TBPTnax1VzZRX1AUJjmKjpLfZB6/vmTCsGHDUvI69CV0lmOiK2PuTQuQntM7mnXZ1XdzOKkJspIEWGhnhaWkN04g0b++b1HHo6MMUfqxHwn0L/pQWaj0HrZ6xWF6LlVxbWd9pf8Wmaf11+ozcwufmmSfIlU/JFRVprBXDEbQyNie8K3RV3fT++iIPvULNv3QEP+LZxPPLP4X16bXfkmPIBVKu/S4h87cr/V9pn+ubzd9w+rfl/4aMb96sTuTY2Om79PnpDsJ1aEiYoWO8XCQVQ4j0wvoKaT3LdKtdeQ3Iq47GoiN1dV2FEWRtVFFgSGAUCiEzWZD05KFlkVuVIPBQCKRIBQKyepk+rG3tLQQCoUoKyuTORZEisT29naZkTscDhOJRJJsqEHjyy9rGTZsGO3t7bS2tlJeXo7V4kDTkmOJx+O0tbVhtVplRbGCggJWrVrFFVdcIWuolpeXY7FYZCGgoqIihFJ9wIABsvaqMNO3t7fLokSNjY1UV1enVKGzWCyoarIAtt1uT3EYLC4uJhQKEQqFsFqtFBYW0tjYKBWy6e81E2HVfyfeR319PRUVFfI78Tkk688I1l1PdDNxAXpCoj8M0ssRiH70RFUQaaBP5MTVI2uj0T98T0G8OP2G3bhxI7/61a9488035WeZPFMhWY/UZrPhdrtlO+knl/4k1C8KAf1JK4J/9G3pF5C4NvXER0b7atqBXIwiglgURhJigdFolPdHo1Hpkq8/+TMRMFH5SzGAzWYFLVnIWM6levC94h6Xy8W4ceN49dVXWbx4MXa7Hbfbvb+0gCK5Aj2RE3Mi/hZEULQpSkDqOQqr1SpzqpjNZvmcek7R5XIRCAQoKyujra1N/i84TPF+FSWZSCZZfc0qN68o32i32+V9xcXF+P1+AoGAJKTt7e14vV6Ki4tlCcmqqirq6+txuVy0trYycuRIGcg1bNgwdu7cSSKRkGZot9tNbm4uOTk5eDweSkpKKCgooK6ujuLiYoLBIGPHjuWSSy5hzJgxskiUfk33tr4oK6USASoqKojH46xZs0YWAc72w6YvkieffJKFCxfidrvl5tLblsUm1p8U+rJ3emIhPFaj0ahsX19M2O12Y7FYpM5G0zT5dywWw2azYTabiUSSJQNFe+K3zWaT5fmsVis2mw2fz4fb7aakpARI1i+12WxEIhEsFsv+ymw2uYAVJRlAKDaaeAaR+VpEHornCofDMuJUOOmI01PPzor7xfPoRYBoNEpRUVFKKkbx/H6/X1YXSyQSkiCIqniijXg8LgsxezwecnNzCQQCshiWvhqdqH3r8/kIhULSPb2pqQmn04ndbsfn88n3LAiuoiiyrqnL5SKRSJCbm0tjY6Osg1tXV0dZWRmRSAS/308ikZD1VktLS/H5fEQiEYqKimhra5Np96qrq9m7dy+tra1A0uws3pU4FIRoXlJSQmNjoyzBWFNTIw+WaDQqq6OdcsopvPzyywwdOlS+M4HeIhpZKZWoh17G7SmIyXzmmWe49957icfjXHLJJSxcuFAu0s6gP1UFRyDuE5tJLEbBMufl5dHc3Izdbk8pvCPuj8Vishq6IBhCVNAXMBZ1OR0OB0ajkebmZsLhsDxpRMFjQYBMJhMOh4NEIkFraysGg0FWUxeb3mQySfO2qBYmni8ajaaEL+s5NL1sGw6HicfjOBwOufnFM8ZiMenxqW87kUjg8XgkF2GxWHA6nSnjEgRKFJIOBAJ4PB4KCwtltfWcnBycTqcsQxgIBHC5XDJfrKj83tDQIOdclC5UFCWFYOifTX+wiKjT3NzcFPFEf6oLzsbv9xOLxcjPzycUCuFyuYAk9yV0O4IDFOKkqBBfUlJCPB6npaWF8vJy6uvrKSsrkzVkN27cSF1dHc899xy7du1i5syZLFmyhCFDhhzmLsgessphGAwG1q5d26MegYlEgkQiwQUXXMDmzZu56KKLeOmll3TFdFKVVvpxdzS+TIqodAVVZ5agTIqzdBYzk5IMDohAHemCDiWXd4bOxnAoPU+6fH6o/jobU1fY7Y7mp7M+Ms1dehvpa6AzJWT69V2d446Usfq1oxdtly5dyu23346qqsyePZuf/exnUizrzRSIL7zwQseFjLoDBoNBRrz1BLEQE/+HP/yB1atXM3DgQJ577jmcTmfGaEoxLnGC6P/X/6Rfq79eX3i6o/v1faffl35N+ud67ibTONPbPdSzdDSu9OfM9MziM7GpxO+u9tXVcXR2TWfXpn+eae7S29D/n/4OM72rQ40h05jEODK9u0zfT506lauvvprW1lZefvll6uvrZZhFbyOrIxBm1Z6EqqqyxsrQoUP7bHKTvgi9tr47ruvH4UHPwdx7772MHDkSp9PJ559/3qmJvSeRVYIh5PeeXFwGg2F/2QQYMKCc5MGo6n6O7UUuFLtHM6ciPD29jUxcWHrfQukJSJ2DUJj253A9eug5jkAgQHt7Oxs3buy16nLpyCrB0BdF6ikoygEbdiIRR9OOv0V8tPMpNn36Bs8klqTf53a78fv9qKqKw+EgJydHav2Pt3nuDQiCXVBQgMPhIBQKUVVVlUKoe3V82Wy8t5Q0ScWnKm31fWGiuxPpeoXDxaeffsr555/P9u3bD+s+g8HAY489xu233y6Jw7///W/OPfdcmpube/RgOF6RzvWpqpqx0FFvIatmVaHY6cyC0N3QNE1aRBwOZ4rPwP5Rcayv60NtTE3TqKmp4Vvf+pYUM8Q8/O53v+OPf/wjLpeLwsLClBB1i8VCPB6XLPHatWvZsGFDygJes2YNNpuNF154AUVR+PLLL7FYLLz55pvSL0VwH1dddVVKuUEBvb/Hjh07WLNmDdddd12f82rsaejfazQalYWE1q9fz+WXX96LIzuArL0hRUk6Ednt9h49efRmLL/fL1m8WCyWcfEea+jqXAYCAf7973/z+OOPk5+fz5w5c7jrrrv417/+xa9//WusViu33347X3zxBfv27eP73/8+d999t9z0mqaxefNm3nrrrZR2a2trMRgMvP322wA0NzfT1tbGO++8IyvmnXzyyVRUVPD1r3/9oHEJ0WXJkiU89NBD/Oc//2H69Olcf/31Rz85xwmEhcdkMmE0Ghk9enSfSQ+RVddw4fDTVb+A7kJ7e/t+OTBpIREv4ERDQUEB3/zmN1m6dClFRUVMmDCBb3zjGyxevJgrrrgCg8HAAw88wMcff8x3vvMd6ZUpcO2113LdddelxDw88cQTuFwuWXbP5/Pxta99DZvNxiOPPMJXv/pVHn/8cemHkwmapjFt2jTOP/98Jk+eLLmgfhyAINoi9gYOhBv0JrIukoicCT0FTdMYOHAgqqqSm5uHwWA6oRdjPB5n/vz5nHfeedx88814PB7effdd1q1bR01NDf/4xz+YMmUKCxcuxG638+CDD6Y4ZD399NOcddZZbNmyBZfLxXnnnYeiKKxbt06+129961vMnz+fLVu2cMUVV/DWW29x1VVXUVxcfNB4DAZlv0u8icLCAgYOrNyvpNYn6+lHOBxG0zQKCgqkN25fUCpnLbwdDgQbic96gstQFEVWo6+pqU1x0z4R8fnnyULJogReUVERtbXJeTn11FM5++yziUajrF69OiUbuHhX//d//0dlZSVvvPEG8Xic0047TbYtrvF6vfh8PpYtW0ZeXh4NDQ2dcBfJ0zMWi+l0Fr2/EfoaRJRwNBqlpqamz6zhrI4gHo/3uFk1Go1SV1eHwZDMat3TEbN9DUuWLMFsNpOfn89dd91FIpHg888/p6SkhKKiIqxWKwUFBZSXl1NdXZ1igRHE1uv10t7ezsyZMykqKmLFihUkEgm++OIL3n33XeLxOFVVVdx///1MmzaNvLy8Tgr8JIlDKBQ6od9LJuh9Y1wuF2azmdbWVgYMGJByEPcmskow9OHdPQWLxcKQIUMwm80MHjy4T0xyb2L+/PkMGzaMa665hlgsRmFhIaqqsnbtWv7zn/+wbt06Nm3aJLkOAVGbYsSIEbz55pts2bIFVVWpra3lvPPOw2634/V6uf/++2X1rIaGBu6991727t0rI1wPRpJI6KN69Z+f6BBuAG63G5/Ph8vlYuvWrUdlRu9OZFWHIUol9iREWHk8HmfXrl092ndfhMlk4ve//z2jR4/m7bffJj8/n1tvvZWysjKcTifhcJhYLMaGDRt477335KIUyrUXX3wRgGuuuUYq4srLy2UKgFgsJuurhkIhotFoiqK0MxzYBCc2UddD5DWJRCKEw2HsdrtMstQXDr+smlWFDNaTVpJIJMLWrVtRVVUmdBG6lEyl345niA05ZMgQrrrqKvbu3cvq1avZs2cPqqqyfft2WVIiEokwfvz4FB3GkiVLWLZsGYlEgnXr1jF9+nQMBgPPPPOMzKB1++2388ADDzBp0iT+/e9/43a7GTduXKeLW1U1mpubcTpd+8fZ+7J5T+FQkbmC6yopKcHlctHY2Mi4ceM6vacn0e0EQ9OSqeIikQgVFRUMGDAA6LmHtdlsVFVVsWHDBoYPHy5dxUOhELm5uT06lr4AoYPweDxomsrzzz8nxY958+7g/vvv56yzzmb37t0yLaD4Of3007nzzjv57//+b3JycmSbDzzwACeddBKKovD000+TSCQ4/fTTue+++3jkkUc6VdAlLWcmhgwZtt+3wIgQR7oS5n484FCpFESuFJHbo68EnkGWdBjCnOr3+wmHwz2qsFFVVfp+iIk2Go3k5eX1SP99DX/84x8555xz2LJlMzk5Ln76059y+eVX8Pjjj1NVVcUtt9xCIBDgnnvuYe7cuVJ3oSgKVVVVlJSUcMkll1BdXU1+fj6apnHnnXcydepULrroIt59912cTicTJkygsLBQOmB1ZdML7s/pdB6Ul+J4RmdzI9at1+vFbDZTWlqK2+3OWIWsN9DtBEPTNHJycjCbzbS3t+PxeLq7i04hFEbCRbmj5CUnCnJzc7nsssv44IPlPPbYLykuLiE3N4cZM2Zw8803M2XKFKLRKA888AA7duzgRz/6kVy0e/fupa2tjUGDBvHxxx8zdepUAN555x0WLFjA1772NXbs2MGsWbP45S9/ic/nY8+ePYc0/wku9Pvf/z6ffPIJy5Yt4/7778fv9x/3YfOdKS/11qloNEpLSws+n4+ioqIuZYvrCWTFD0OkKxOZsHtSh2EwGCguLsZqtaaUaTwRiQXAjBkzmD59Orfffjugce2118g4kGHDhvLoo49xzz33sG7dOh599FGuvfZavve971FWVsbKlSsPSvASj8e56667aGxsJBgM8vzzzwNI9/J77rmHt956i5kzZ/LSSy+liDJwwDXc4/Fw8cUXy0pc6YlnTkToRbJYLEYsFiMnJ0fmxO1pj+lMyIoOQ+SU1DSt1+I3otEoPp+vV/ruS1AUhWAwyDvvvMPzzz8nyxM88cQTFBQUYjKZePvtpXz7299m6tSpvPrqq5SVlQFw8skn8/TTT7No0SJZzPeGG25g27ZtMtz6pptuoqSkhGXLllFVVcUll1zCZZddxqZNmzocj6ZpDBo0SCa4hQObRSQJ7gunaW9AeNkajUYsFgstLS3s3LmTk046qdfdwiFLHEZzczOxWEx69PUUBGWuq6uTiWVPFEWaHmIzi9iQnJwcNm/eLAMBn3rq1yxf/gEtLS24XDk89NAFzJw5E4fDwZVXXik39RlnnIHX6+Xmm2/m//7v/1AUhfHjxzN+/HipTA4EAkyYMIHRo0cD8NxzzzF//nyeffZZmSA3HYqiSC9PPQeY7mV6okFEd4u/rVarTPzcF4gFZMmsKupiiNOipxaA8MHIzc3FZDLJrN4n4ml10kkn8eGHH8pn12/eM888k/HjxwOpCYD1m1X8Ligo4JNPPpGJnPVzaTKZ9os6B3DKKafwl7/8pcNx6fsQmcPSc4SeyBBzEw6H5RruS97KWRFJCgsL5YOKgjw99cBGoxGXy4XD4UgJbz/RYDabUwrh6JEpvqazOSopKeky4RWcQleu7ScQHcNkMkkOuS+lZcjKGxOmTZPJ1OPOUkLD7Pf7U8rrnUgQLH9HbGx6hmxxT6b3JLgKvT/AofrWZ+s+nDEf7xCiYlesQKK+jFjPR2o96u6Ezd1OMMTCs1qtsrBPT0JVVUKhEAaDAZfLRSQS6XH39N7G4VobDnXd4bR3uP2eSDqL9CTKnSESiRAIBICkaVwUZDpSdNccZ4XDaG1tlWHtwmutp2A0GikqKpJKv66ejP3oR7ahaRqhUKhLhgCTyURJSQmJREI6cYk2uop4PJ5S27c7kJWdZLfbU2qS9OQJoqoqp59+Opqm8fjjj9PW1iZL4wklWz+6FyLCsqMffZZyfYkE/U/65wL6UzlTeQV925qmgaqhqSpqPEE0EsHT5mbfvi9R1QiJRIRwJEgwGEBVk7VcRZnE9vZ2mSFOtCf+FmtZX54hvbRC+k8sFiORSMg24vE40YRGTFVodvtoj8YJxxJ4/MGUtkSd2cbGRpnXJT8//6CCU11BNpy9sqbD6C0zkMFgYN68eSiKQn19PQsWLJALo5/TyA7EQhbeifX19fIkFSJhKBSiqalJZpIS6KqMLb5Pv04UMRbEJGmanUYAACAASURBVB6P09rSSmNTEzu270hG0MaitIfbCQQDhIIhdu/ehc/nZ+vWrbKuqdfrRVVVvF4voVBIhvILB7XW1lYCgQDhcJhAICBzvbS1tREOh2lvb5f964lYe3s7wWCQHTt2EAyG8Pp8NDQ00Ob2EIlG8PuT9WL19XsURWHRokUEg0HGjRvH2WeffUSiWzac4bJiVjWbzUSjURnsJSYh06LoLGqvs+87g91u54477uD555/ntddeIxAI8MMf/pDRo0enZRA/NA7V/6Ha0j+3UAT3NRxNrI/eLCsUdPr/xcmo5xI6OlD01rSuEhChlNU0DU1N3i+KPhsMBrweD5FYCJ/Pj8PuxGQyU1hYjM8XQFEUmc3K4XAQDAYl0RORzrFYTFZVFwQhGcinST2dgCCOdrtd7gG/308kEsFoNBINt2NEw2G14G5twd2SdHJsDHgpKioiPz8fv9/PN7/5TT788EPC4TC33HLLEb2XbCErZlXx4lVVZcmSJYwbN47y8vKURSIWkd59W0DIXYfrDis09A6Hg/nz57NmzRrWrFnDsmXLePvtt5kwYcJB4xNtiyzNkUhEflZUVERzc3OnfQo9icgsFo/HsdlsxGIxnE4noVCI0tJSGhsbaW9vJzc3F6fTSSAQkKxtRUUFTU1NMvV/Q0MD8XicAQMGEIvFcLvdmEwmBgwYwM6dO2W/Q4YMoba2lnA4zJAhQ3A4HPh8Purq6qiqqqKxsZHq6mpyc3PZtWsXfr+fc889F7/fLwObAoEAq1evxm63EwgEKC8vp7GxkdGjR+NyuSguLmbNmjUMHDiQWCwmkxJpmkZ7e7t0wRfvPv396t+dYO1tNpv8zO/3k5OTQzgclnkfTj75ZDZt2kRpaSk+n4/W1lYASktLZfV0RVGorKwEDtTwjUaSxMpsMhGOhNmwYSOTL7oIj68Nk8kMKKhq0o29srKSpqZGotEo5eXl8h0Ky57RaExRmIscK+LZHQ6HFFOEv0RFRQU7d+6U3M6QIUPYs2cPI0aMwO12E48nsNlsuHJyCPj9NDTUM3z4SSQScb788ku2b9/OokWLpDn8tttu46qrrurS2u8pZKV6eywWY8iQIfh8PlRVJRKJMGnSJG688UbGjBnD2LFj5fWZzG9iIwEZCUpXx5FIJHjqqad45pln2LNnjzzdxAsVhElYVILB4EGczaFMsoLdE8pV4eEqCkB7PB4sFov0utS0ZN2UlpYWBgwYgNvtJhKJAEknqZycHOrq6lJOfb0oZbFY5KIV1iAxzkxOWHpRTPwvFnkikVzA5eXl1NfXp2wIvbk1Ly8PTUuGyZeXl9PS0gIk3e8zhV53laMUAYIWiyXFK9dqtVJYWMi+fftwOBwkEgkZ9QykECiTyUQ4HE66kysGEok4FrMFk9lENJIkTu2Rdmw2G6FQksBZrXb8fh+qmjjAneznhsxms7RICN1X+roSZuZEIoHVaiUnJ4eWlhYcDofMWG82m7HZbHi9XpxOp0yKo59Xg8FAWVkZbrdbEkGxjm677TYWLFiA3W4/KJt7b+GFF17IDsFQVZXrr7+epqYmPvnkk5QkOoJ6jxgxggsvvJBvfetbnHLKKQe10dDQgKZplJWVpbDxhyMiiL9jsRi1tbVs374dVVVpaWlJ4S7013cmsnQmJulPVMG6igA8Ea7scDgk5yEISyKRIBgMynE2NDQwYsQIFEWhrq4Oo9FIaWkpkKw1kpeXRyKRkPoA8b9Q2plMJoYPH8727dsZPnw4ZrNZKuA0TaOpqYlAIEBOTg5ut5vy8nLa2tpkm0OGDJGbobm5mVNOOYVwOExBQQGrV6+mpKSEd999F7/fz+WXX86WLVsk+y82jtlsxmQyoaqq3MwAeXl5mEwm8vPzqampkekU29racLvdhMNhCgsLmThxIps2baKxsRGj0cjQoUPxeDx4PB5isZjkCCKRCMXFxWzduhW3283oUaOor68nHI7sP6jCTJo4ibXr1hKLx/cTTOFUZiAY9MkcILFY7CAXgPQ1IpSSRqNRrqFgMCg5gtzcXFpbW8nJySESiRCNRnE4HDQ2NtLW1saoUaNQFIU1a9YwePBgamtryc/Px263Y7PZsNvtzJ07l8GDB3PZZZfJfvuK82FWCIYeiUSClpYWYrEYn376KY8//jh79+6ltrZWviiDwUBRURGFhYVMnjyZyZMnM3bsWPLz8wmFQuTl5WG1WuW1nSku9Yqx7rbv6zXifSXUuKchCOGsWbPIyclh8eLFko3vLSW33iphNpvle9Fv7o642HA4jNVqldfq15loI11HI7jS1tZWKVqJQ1CILYIz0afYi0QiUg/i8Xjk54qiYLFYMBqNGI3GFJ1IX0PWCYaYYD176vF4+Oyzz1i+fDl+v58XX3wRv99PPB7H6XQSiUTIycnhxhtvJDc3l0svvZTBgwdTXFx8SEqbiZ3uLvj9fnw+HyUlJSesb4dI63fOOecQDof55z//yYQJE3rV+UrvBKUfR0efCwiRVXwn1o5eBM7Erer7Fdyjvm29bqwzkUzPzR7K27avoEcIhn5CMokBNTU1NDc38/rrr/Paa6/h8XgIBAJSdlSUZOanyspK7rrrLoYMGcLgwYNxOp0ZiyS1t7fT3t5OTk4OFoul215AJBKhra2NsrKyPv9iuxPp8/vUU0/x1FNPEQwGueOOO7jrrrsOUm725Nykjy99rXXEbWYy5abrgLrSp55AdGZt0retJzTpYm5fXldZJxiHA0HxGxsb2bx5My+//DJer1fW7DQajcT3y6ElJSVcdtllXHjhhQwdOpRzzjlHnviBQIC6ujocDgfV1dUpCr9+HD70JzHAtGnT2LVrF1VVVezcuZPly5dLC1h6yPqxCFVVicVisjzhsfws3Y0+RzAysXLNzc2sWrWKHTt28Nprr7F27VpUVcVsNpOTk4PP5+Oss86ioqKCM888kwkTJnDOOedI2VUvk/bjyCC4vRUrVnDddddRUFBAKBSisbGRf/3rX5x99tkprPmxvMmyqQc71tHnCEa6zKjf6OKki0QirF69mj/96U9s376dDRs2SEcaAKfTicViYdKkSXz1q1+lurqa8ePHy0SzorhSpvbh+AiISmeZj7YtoQ+YO3cur732Gj/96U+JRCL86Ec/4s477+Thhx/uETlcL9Jmq4+OxJR+9DGCcbgQPgOtra1s376d1157jdWrV7NhwwbJVpaWltLU1MSYMWO45JJLqKqq4rrrriM3NzdlYcfjcdrb29m1axejR4/uVt1Hb6A7N5Yg1LFYjIEDB2IymZg4cSJz587lmmuu4ZJLLuGNN97IOsHQWylO5BR+vYkXXnghu5XPsgkhupSUlFBcXMy5556L2+1m79697Ny5k1/96lc0NDRQXl7O+vXrZY7JX/ziF+Tl5ZGTk8P8+fMZOXIkOTk55OfnU1hYSCgUkvLrsYxoNJqiVzgaqKrKCy+8gNFo5IwzzmDbtm2sWbOG008/nVWrVvHhhx8yadKkHuHM2tvbsVgsPZ42oR9JHLMcRibWUdM0IpGI9NiDpDn0jTfe4JNPPqG1tZW3335bejgGg0HplTp37lwKCgoYM2YM55xzTofOYukndyZtvPBXSE9S05PQa+6PBuJknzNnDn//+9+54YYbePvttwmFQkybNo333nuPU089lSVLlgDZdTLqTlGrK9CHKBzLHGd34ZjnMDJBz64qikJubi6zZ8/m+uuvR9M0GhsbWb9+PZ9++ik///nPMRqN1NTUsHDhQuLxOBaLhVGjRlFdXc3MmTOZPHmyzKKdbjcXfWQyF/t8PgoKCg4rFqY70Z0se0NDA++//z6KksxAvm/fPiKRCGPGjOHjjz/ms88+o6mpSfrKZAs9PY/6/nrrPfY1HLMcRiboFaf6U0HvD6JPkaYoCrt37+bTTz/lb3/7Gw0NDaxcuVKyvCaTCbfbTW5uLr/4xS8oKSnhpJNOYuTIkbLtSCTC7t27qa6uxmazpTgBib+PZXlb0zSeeOIJFi1axMiRI6msrKSxsZHZs2fLOfP5fNx0001873vf6zNuzP3ofhzTSs9M6Ihl1Z8O+mtE6LLY6PF4nJUrV7Jx40b++te/EolEWLduncytmEgkKC4uZtKkSRQUFHDWWWcxbtw4Bg4cSG5ubkYnNREglQ59xuy+SFAEOx4MBrn22mtZtWoVw4cPp7a2Vuab/PLLL8nPz5c+L2+//fYJV/D6RMJxRzAOFyLxSU5OTgpnIDZwNBplz549rFy5kl//+te43W7q6uqkpl7TNGw2G3l5eQwfPpyFCxdSVlZGVVVViliUKc6ira1Nikx98VQWVqjt27dL/YSmJUPaf/Ob32C1Wpk7d66MynU4HMydO1fmQOnH8YcTnmDo4wH0YoQQXdJDn30+H7W1tXzyySds2bKFP/3pTzKiUtxrs9kYMWIEl112GU6nk7lz52ZM9y8KLg0aNOigPCFdwaHiFA63vXToU8+li3Zjx44lJyeHjz766KDw9u7mmNJdp/vRezjhCcaRQognNTU17Nmzh/fffx+/38/ixYsJh8Ooqkp+fj4+nw+Xy8Xo0aM57bTTOO2007jwwgspKCggLy9P5lAQTmXpwU8d9Q2ZXZjTA6+6W7svojrHjh1LY2MjO3bsoLCwUPaVDfQTjL6DfoJxhBCu0vpTVWST2rJlC9u3b+eZZ57BYrHwz3/+U4Z/C12Iqqp85zvfoaqqiiuuuIKSkhLZdlcIhvgJBAK4XK6D4mUE53SkyYc667uhoYGzzjqLWCzGtm3byMvLS+m7u9FPMPoO+gnGEULvcdhRNK6Y1q1bt/LRRx+xdOlS3n//fSoqKmhsbMTnSyZvSSQSnHbaaZxxxhlceumlXH755SlsvshKlUncgMw1SbPlr6BpGrW1tZx55pkkEgm2bdtGUVFRVv0U+glG30E/wegBCG4gkUjg8/n4+OOPqampYfHixezbt4+Wlhai0SiKouByuXA6nQwdOpRx48Yxa9Yshg0bRnFxMYqiyFq1Xq+XSCRCeXl5j1pYNE2jubmZM888k9LSUlatWiV1Fn3R0tOP7kU/wegBCGIhIE7KWCyG1+ulpqaGd999l/b2dpYtW8b69esl1zBgwADy8/OZPXs2ZrOZiRMnUlpaSllZGZqWzFrd0wSjqamJ8ePHS6Wtoih90srTj+5HP8HoAaQ7jQkRAw5msz0eD7t372bJkiU0NDTIKugej0eKLw6Hg2984xsUFRXxta99jdLSUql4zIRMSVoy9d3VZ6mpqWHcuHFYLBb27duXosfpx/EH8X4TiQSLFy/uJxh9DfrSdlu3biUUCrF8+XJWrlzJe++9RygUkuJLNBrFarVy1VVXccEFF/DVr34Vo9GYkttSj6M1fWqaxo4dO5gyZQpGo5Hdu3cD/fqF4xl6JftLL73UTzD6GvQeokKc0W/u3/72t7z//vts3ryZzZs3oyiKLE2ZSCQoLCxk6tSpTJkyhdLSUi655BLJ2YgwfuEsdrjQNI2dO3cyadIkzGYze/bsAfoJxvEMPYd8XIsk+pM61ZpxcGLX5HrvuLzAoTZEpsAkvb9ERzJ+RwFNehGmo/5F3c5PP/0Ur9fLb37zG9xuN2vWrNmfib0Any9AYWEBDoeTW2+9hYkTJzFq1CgSiUSKR6beupJu8Un3gN22bRsTJ06koqKCzz777KDxdWUO9XE2+j71Fp9MY+joPej7TLcYiXb0ayA9X0h62+kinL79zsakF/86+y79+/T5z/QMvQX9mF988cXjl2AI0ydAfX0969ev54MPPkDTVFwuJwaDkVgsWc6xqKiIYDBZ18Pj8chKZCaTiZycHILBICaTCbvdjsFgwGg0yoI1LpeLUaNGZcyhoSiKrM8hXK2FV2j64hDXZ3odOTk5slKafhGJwjk5OTmy5kckEmH58vf50Y/up7y8jNzc3P3K1VoUxUBubi4DBw7km9/8Jjk5OYwYMULqSAoKCmROEKvVitPpRFEUmpubUVUVu92O2+1mwoQJDB8+nOXLl8vNmEgkZDYzPYHUbz69SKTfvHqnNf28iPtEO3ovXP3f6YRAtCWQTngzzbM+UDA9VaSwUKVvZv33mQ6Gjrxx0wllpiTC3e1D0x04rjkMTdPYvXs38+fP54MPPqC5uRmbzUY0GpEvxWQy7l8MKopyYBEPGjSIffv2yQJMmqZhsVjIy8sjGAwSDodlMSJRS1QsdvF/fn4+VqsVn8+H3W6XaQTFgtQ0jaKiIqLRqCxQLJIciwUvFurAgQNpbm7GbDbT3t5ORUUF9fX1FBQU4Pf7KSkpIR6P43K5yMvLo62tlaKiQrlpkoVy7OzeXYPJZJLlHOrq6igrK2Pr1q1YrVZcLhf5+fl4PB4ZX2Oz2YhEIrK8YkVFhTQFi8ztl112GW+99RYOh4OhQ4eydetWLBYLfr+foqIiGTcjas0oiiLrzLa3t8trDAaDrGlqMpnw+/0AshxjLBaTHq6QrALncrnw+XzE43EcDgd5eXmoqiorn5tMJkaMGEFDQwOJRIKLL76Y5cuXy1ohlZWVNDQ0SK9Zg8FANBpl5MiRlJSUYLFYyM/PZ9iwYSxfvhybzYbFYmHFihWMGjWKWCxGRUUFJpOJpqYmNE1jz549uN1urr76av74xz9SUVFBcXExFRUV7NixQ/rh5OXlccoppxAKhRg6dKhMbl1YWEhJSUmfUyQfdwRDz1Vs2bKFqVOn0tzcTEVFhayhOWBAOYWFBbjdHgIBvyxr2NaW3NChUIiWlhacTicVFRUEg0FCoRDt7e1STyCyWQnOQX/yiOkUVc/0lhFxiojTymazyWI2QscABwLW0k82PWstivAIxWc4HMblcgEQj8dkOb9kn2A0mojF4pIbEAQmFovJSuQiH4jb7Zau7YLA+Hw+EokERUVF+P1+nE4nra2tKVm9YrGYLG0oNrJ4BlEm0GAwSIIsuK6ioiK8Xi+KolBaWorVasVms7Fr1y45J6LKm9/vl4RXFAwSzy0qxovKa7FYjPz8fILBIIqiyPfmcDgwGo2EQiEgWaIyFosRCASSRZOjUUwmE9FoVFaIGzRokKwQJ7J9Cc9dcZB4vV4sFotst7KyklAoxIABA9i0aZM8eAoLC2lqasLpdAIwZMgQvvjiC5kdf/DgwTz33HOcc845QMdJicRhJt5btnFcEgyh2Bs3bhx79+4lNzeXZ599lqlTp+5fsEk9hnCdFhtRUQ5UMxPsdUfs8ZFAX+O0K0iXh8WJaDKZ2LlzJ3a7nbKyMjweD4lEApPJRG5u7v5NXZChX2X/TzIKd+vWrYwaNYpIJILFYqGlpYXt27dTVVVFTU0NRUVFNDU1SWIkxiIq1onap6L9kpISfD4fRqNRln4cOHAg4XBYEhZIcgUi45mqqtTV1ZGbm4vVamXfvn04nU5KS0vxer3yXQgCKoi1sAIJhbCI6wmFQowdOxaPx4PJZMJms2EwGGhvbycSichNnZubS01NDU6nU4qciUSC6upqdu3aJWvGaloyNUFhYaFcJx6Ph9zc3JSasKK05KBBg/B4PJjNZlpaWigtLaW2tlZyhRaLhR07dtDa2kp+fj6VlZUoisLGjRs56aSTaGlp4Xe/+50UfxcvXsyFF14on18PvVJcKLKzjeOSYKiqyptvvsm1115LRUUFTz75JDNmzJDOUwaDQiIRZ9++fRQUFOBwOPZzJckNlUlZli6Pp2/8rkxha2srRUVFh7wuXa+hJxr6cYkFlC7HJz/rKC9IapuiKLP+/4Pv+f/tXX9QVNf1/7y3v2CXZdd1QQQEgUiCylikFJv4I7Gh6TSmTTU6sU5jk7RjdCYdo/nR2oxt06ZWnaYzTv9wOk7bJNppO4nUdBLTpoYkYvodrb+qiCKiiPyK7C6wv9l9733/WM7lvsfbZUFqUqZnZofl7bu/7z33nM8599wRPIA3sdHF06mujRxhxoLqHT2JTK9sHnMgKYV2de04aYFIHuzWc63XYgb0mx5QqTceWjyFfuOvWQRG8Br+2ka+LG3eZ86cwdatW9HU1ITMzEw0NjZi1qxZozYr7VjcDrzjtddew2dLSZok2rdvHyRJwurVq/GVr3wFANjdlYIgwmg0o7CwCJmZNoTDUYiiEQaDkQ0ofUikp5vF+QlERIsh2YcmFn/mgj5672uJf59/1t7ezp6NzkOEoghQFAGSpEBRBHA3B7Ky+SsXkoGK9H9bWxu7LZ7S+f1+1aLWfgKBQNKLpLTpqO7JmFY0GoXH40FLS8uo8vg7aPhFRO/x40rzgMZGb7z479rwi9r7WrVM5fTp04zJ8jfz/fWvfx3l8as3rp/73Oewa9cuxGIxeL1e7NmzZ5jpSVAUadTcu9132k45hsFjAaWlpaPwA+1AkbUDGD3p+TyJkr2TjPgFAYCBoslIT6Lg/49Go/D5fCgsLFS1i/AAepfqFo/HGRhHgGF3d/coBjgwMICbN29CEAR0dXWNWrgFBQWwWq2q9jgcDt1+pQ9dVszv5NTfev2YuHE9qiqXnmdmZiI/Px/5+flJ+1gQBITDYabOpKqb3hgSRsUzAl5KIRWKTxeNRhEIBNj7pHLRO9FoAmR/+OGHYTKZGJCuZYj0V1EUVFVV4cknn4TVasXZs2e5/lAzF37e3i6acgyDQt/JsoxFixYBSO22zF/aS6SVIrQ7Ev+OVqTVPtOSdifUfoii0ahqdxscHMT169dhsViYeZdvFx8aTxAEZmGQZRk9PT0IBoNMBSGxnnRgIHHDHBHp2Xy9tGpJqrbwbeVjqFI9UxH1s6Ikbjm/cuUK2+kpiBFtCDxRGZmZmXA6nSnLSEZGo1EVTlFRFHR2djLJRBRFFBcXq9pJlppwOAwAmDt3rqqNBPzS+2ThIeItbXw7XC4XLBYLLl68CEmS4PeHIEv41Om/Nmp4MgqFQujo6FCpAcnIYDAgNzdX9Uxvl9b+5SeMdieMRqMsRqiWSLQmkd5qtarKpPwEIeG9yZPJZEJBQQFEUWRWAZ609cjKymI7XkVFBfx+P8LhMBwOh2pBGY1G3LhxA6WlpawutbW1jClpmQXfN1rmSfWg77Rw9FQFLfFqIC/18Lu1KIooLCzUTU80ERE92RwRBAGFhYWs3ry0Qe2i96xWq27baH4RIyLLCJWptW4oSiLmiMvlgizLKCychWAwDCkOwCpAwO2TJvRoykkYVquVTSoKzDsRogHl9U4taaUTEsNTMSmr1Qqz2Qyz2TwKO0iVLjMzc1yL4fDhwwiHwwgEAswM6nK50NTUhDNnzqiAUgIvCbPhF7oe8UyBf5aKeGwgXSoqKsKcOXN0pcBkZUwm8dKqFnT2eDxszFLVj+oUiURYWn5ODQ0NMekEGJHaent74fcPorPzBrKz7VAUATqC1W2nKSdh6CHd40mb6pkW2dbuvOksGkobCARgt9tHoebJiCZSOnU/deoU1qxZg+eeew7PPvssJElCX18ffD4flixZgvvvvx+HDh1iaWbPng1ghAE2NDRg0aJFzElJURKBc4qLiyFJEiKRCCKRiMrqQwtBlmXmp6AoCt5//32EQqG0GUxpaSm7xoHeGavt2ny1OBBv0k7Vx6yM4RMEBFr6fD44HA7VbWuE58iyjI8//hi1tbUMs9GrE/1Gc4a3HpGpn353u3MQi8UQi8VgsVA6EfFYHGaL6VOVMaYcwwgEAjhz5sy4dxutWkBEIiPp+6FQiHlBpkqnR/wiIA9QSZLYoqQdPln9Ukkh5JMgyzL+/Oc/o7q6Glu3boXVamXqzaOPPoqCggKcOnUKH374IRYvXqzS24lh3Hvvvar7ZQ8ePIj169dj8+bN+OEPf8jubeEXJr9z8iL766+/joMHD2Lp0qUYHBxU9RkxXYPBAJvNhn/9619Yt24dduzYwRa41hyZqm/573rYUjpzgmdLMhQ0NzfjzjvvhGm4j0gCM5lMrN3Tp09Pis0kU03J1ycx5lSqgHA4wtRWo9GEvLy8YdXSAIvl9lpE9GjKMYyMjAzMmjULfX19KdWJiRBNbD1Kd0ISkW7b29uLkpKSMXdQnkHplROJRPDiiy/CYrHgwIEDsNvt+PnPf45z585hy5Yt+Oijj+D1etHQ0IC///3vWLNmDd544w0sWbJEhdHoAZx1dXV47rnn8PLLL6OiogJr1qxBKBSC0WiE1WplLttkreEtLEVFRaitrcVbb701CsfgJS4AWLFihQoboT6fSP8SUd3G7QkpAG2tbSgpKYEgpsbBSEIbD5FnbqJdI88VRYHX68XQ0BAcDge6u7uHmZQRoVAY9mz9+Xe7aMoxDJPJhGnTEp6O/I6txQvoGaDvxKNHeqAdmdsaGxuxbNmytJ26BCFxzqG4uJj9P1bZRLQ78enMZjPmzZuH3Nxc7N27F1u2bEFeXh7sdjs++OADvPLKK/jLX/6C/Px8PPbYYzCZTHjkkUewe/dufP3rX4fT6WRt8Xq9sNvtLP/MzExs27YNb7/9NjZs2IDCwkIsXryY1YvSWSwWmEwm5i5vMBjYCdqqqipVW7T9LQgCLl++jMrKylH9lKofxyKKD5JO37K/w8+tViuiQ9FRADRPsizjwoULqK6uVuWnB5rzbaBI8YKQCJDkcDigKGB3A5NKYjIlGF0oFEFXVxcq5s4BPkWlZMoxDEVRWIxMPVu33vtEqRZtMnVAURJu22VlZUnTk7hOYqyiKMwMOpb1gMqghdnc3Izy8vJRQKnRaMQTTzyBo0ePoqamBlarFRkZGejt7cVvfvMbOJ1OfP/732eHs8LhMAoLC/Gzn/0MP/7xj7Fp0yZs3bqVnbWIRqNob29HeXk5gsEg7HY7mpqaMH36dPzgBz/Ahx9+CCCxINvb2xEIBDB//nyVCZqYSHZ2Nvbs2cOe6fkQkHQya9aspP0/HqL30wWKaR5Iw8xPVmTk5OZgKDqUwECS5COKImbPno3u7m4GthPu4XQ6VePKM5ER7Iq/EdsTjQAAEg9JREFU/4bwjkyYTCb4/X6Wp8FgwB13lOLTZBbAFGQYWpMXT7ToSGcfj26biujqwGT58CY5WhjXrl3DzJkzIYoiM68mI150nzFjBoLBIJxOp6q8WCxx4OxHP/oR5s6di927d+Pxxx9HfX09/vSnP+Gee+7BqVOnkJWVxY7KL1++HEeOHIHP58OXvvQlVsesrCzE43Hk5eXBaDTCZDLh448/RjQaxc6dO/HCCy/A5/PB7XYDAMrLy1VHwr1eLwYGBlBaWorBwcFREgm9x/cJ/Z1sNTJdUpSE+7ZoMODqtavo7+/HwqqFaL/ejrKyMt3rLolcLteosU9IDPrxPuh7otwRU6soirDb7ezELlmwAMBiMaWsw+2iKWdWjcfjnBOSgsRBszhCocAwN1eDYzy4xvsTpEu8q3E6OASBm2VlZcjKyhrFLLQmPCJyHnK73Zg2bZrKe5Py7OrqQlNTE3bt2gVFUfC1r30NV65cwbFjx7B582bs378fe/fuRUlJCZxOJzweD1avXs3ujKU6UrtycnJY295//30sX74cK1asgMlkwh//+EeV5MM7trndbtxxxx0QRZEdW/d4PCgqKkJhYSGsVitcLhesViuysrKQnZ2NjIwMWCwWVneSytJRE7XmT+048vVMlgeQkNJEQUCWzYaa6s8DUCBCgMVsSaxsLi9Kwzt18ePMm5AlSYLX61Wpb+RVCigQRQMEwTDc7yIslgTgnJ2dPXyQT4HRZIAgJubzp0lTjmEMDQ0xNJ4YBpEojvbdp8+tcu9kKotWdaAdhz+LkK51hbf79/b2sknn8XgAAC+88AIcDgeeeeYZeDwebNu2DU899RTq6+sRCARw11134eDBg2htbcX999+PtrY2yLKMpUuXqhYboL4qMRaLob6+HtXV1bBardi+fTtb2LykMHLAb8RbUxRFhiu98soraGxsRHd3N1paWtDZ2YnOzk5cv34dPT096OnpwYYNG9JiFER+v5+Zc1NRKoZB/d/Q0ACv14v6g/UJJmwwoqKiAsoYfhZ6Y6idZyQR0gYzMDAwzDwUCIJ6LtAR+/7+fsybN2/4vc+AmyemoEoiSRICgYDqGYn9iQkuw2CYXD5Ji4q30yd7LxQKsUhWejSW+ZAW0vz58wEAfX19+Oc//4kVK1Zg3bp17LnFYkFZWRnmz5+P9vZ2LFq0CPfccw/cbjeysrIgyzJqampUizsYDKqsQFTX3//+95BlGc8//zxkWca9996LUCiEgwcPYtWqVQgEAizsn7ZdFy9eRE1NDZqbmzFv3jxEIgnwTmsh4XfuYDCI/Pz8tJy8Ojo62HULbreb+Udo09JCTNWn8+bNQ3Z2NjZu3KgCwiORCJMESaUcywmNjr1TGi0DpKP3yUgURRZaQBTFT01V09KUYxgmk0mlpxON7AJqxx6t5WQieAYvDqdKr3XrJkbDnwMZi/gTkAAwY8YMPPzww5BlGXV1dVi2bBkkScLevXvxxBNPoLKyEu+88w5++ctfYt++ffB4PCwIDK9G6bmc9/f3IxAIYOfOnXjyySeZXp6fn48XX3wRTz/9NO666y7MmjVL15JAiy0cDuOrX/0qKysej8Pj8bDzEkRkoamoqMCJEydU4xSJRFgsDn68iouLIYoiuru7EQgEdOsxViwSQRDQ3d3N/CuoTPqN8CleohprvLQh9rQ4Bl9PCobEkyRJiMViLHLYeDxk/5M05RgG6Yh6btsAhqNOJXTOgYEB2O12kO/BRMFP2g3SIa2JbSKqULJ6kgMY5btz5074/X6cPn0au3fvxsqVK/GFL3yBqWA8GEu30M+YMYPVb+bMmXj66aeRnZ2NzZs3s3Mdoihi06ZN+OCDD/DUU0/hvffeY7sgP7FpHL71rW9h//797PnLL7+MPXv2oLGxEWVlZTh69Cg+//nPw2g04vz58yxgDYUVMBqNrH+1bSfzJJ2FGU9/ESmKgry8PPa/3iXXzIoybO1KRamkGW19FEXR9RFRFAV2ux25ubkqK9qtAvS3Sp8NtjWJROpHso6lhULfaRFMlMiMO1E/gcmaAKFQCGvXrkVVVRWcTic6OzvR1NSEdevWoaamBr/+9a+xcuVKFjEqFAoxJytRFJGXl6c6iGcwGLB9+3bs378fO3fuZIfReOB2x44dOH78OFatWoVwODxqF2xpacHAwACKiorYs08++QQHDhzA9u3bUVpaCkmSsHLlSmzcuBFGoxELFy5EcXExBEGA2WxmC28szEfb//w7fFo94nd/KlebB9FkWyqS1ctoNMLj8bBrMtPBum4HTTmGEY/H0dvbC0EAEv0rwx8YQOuVFkhyDDwImpWVxQK/TpRogv0nRUYCFLXgHo+2m81mLF68GM888wyuXr0Kl8uF1157Dd/4xjfQ2tqKb37zm9i/fz+sVitCoRBcLtcoj06+nG3btmHv3r1444038MADD7AJS1YBMpe+9NJLOHLkCNavX4/BwUFmnozFYvjoo4+Qk5ODOXPmMLXt8ccfx9q1a7FhwwYAicX86quv4tChQzhy5AjbTfkgNrw6QKpfT08PA0cnYzFp1YxU+VEsV35MJrphJCNJkpCTk8MCBn1WaMqpJCZTwv++vb2dPTMajMjKykpMPAyfLRrDWSpdmuhEHW860s+1O1w0GoXX68XMmTMZWEdxOkVRRDQaRVtbG6ZNmwaLxcLif77zzjvo6ekBMOK7IssyTp8+jZ/+9Kc4duwY/vCHP6Curo4thv7+fuZF63Q6EY1G8eyzz6KjowO//e1vsXz5cmzbtg2rVq1CR0cHXn31VXznO99h6sratWtx7NgxLF26FNu2bWOLLRKJwGg04rvf/S7eeustLFiwIGn/UF14gPVWmUU66ZOBswDY3Jrs8inWxmeJppyEIQgCWxgJ1iAiI8OKHPcMQBEBRT3wqWg872jfS/Z8ojQSYlA9ueg8B+8AdeHCBdy8eVMlMYiiiPvuuw+ffPIJMjIy8Itf/AILFy5kh9OCwSB8Ph/mzJmDoaEhHDhwAA888IBqB+edkSRJYpG+f/WrX2H37t1Ys2YNw0hWr16Ny5cvY/Xq1ez9CxcuoLCwkAXidTqdyMvLQ21tLd59913Y7XZs375dtx/JgYkkAT4W6WT2Mz9uyfLv7+9HPB7H+fPnGdNL5eOh90mnHh6PZ0LnVNLJe6J9NuUkDAoWm6CEVSQhSkP1bDyxJXjEPNlv/O8kOtMCvtW4i4Ig6O40oiiysPWhUIjp/JWVlXjppZfgcrnYIbSqqiqsX78eixcvRmVlJXbt2oV9+/bhkUcewfTp01n0aZvNhrffflvlt0DtotOwQAKLoHZZLBZ873vfA5Dwg5FlGf/4xz/Q1dXFvFlNJhOam5uTtlGWZfztb38bFU2L+jccDqvAQfpOatlkgoLEJCORCDu1y0szdKz/7rvvVo11snbxoGkwGExLIiH1j6SYzwpNuajh/f39mD9/Prq7uzEwMMAW2kTNpXoHvbTv0J0bNLm0i+12mMT4SatnsyfGxR+Dp/rRAtGeIiVAVBtZi4Bi6hveKiBJEm7cuAGHw8ECGKXTB7yzFi9J8Tu3Xh60u6cao/EQ1YGip5Fqp4eTUB/dvHkTubm5uvW7cuWKSkoIh8NpBUPasmUL6uvr4Xa7cfz48UkFPGnOjhd7m5JRw/kj6OPxGNSjZDiHVrwkXwr6bWhoiAWG5QG7VOXcqgrDl8Oj6hSElsIC0mLkXblPnjw5qp2RSARtbW2j6jc4OAifzwdBEJhKom1ja2srfD6fqi1jieZUFz2HK8qfd9+nz7///e9RB7y0AOl4+pXGj8IF8sw1Wb+TWz1fJhExC2pHqpOv2vQ+nw8lJSVp1Xu8ROdVxktTjmEMDQ2hq6sLwIh7c7oh3rSkReqJCPAaGhqCJEkqz01FGblWUYu885gCP6kkScKlS5cmXE9Af8EJQiIYMAUABoB3331XFZJPURQsXLgQgUCA3dglSRIyMzPZqVhgRPR3Op3Izc1lsVMB4Pz58wgEAiwi+H333YfZs2ePYhiRSERlXeB/11pG+DbwbeNxBUmSWAg/beg7eicVvqBHxJhIiiK3+2REFhOac3r58dKc1lclWZ4UBJq/RGqy6FbMtFOOYfA7kjYk/GSWwUep4ncyPty/HiXbRYuKiia1ntTu7Oxs1a5WV1c3yvFIFBPRuDs7O5mEMla9bTYb2/3Ky8vZ4TG+v0lVo/oEg0F2ONDr9U64TcQsgIT1aGBggDEknqFoncnSWXiCIKC3t5dJFj6fb8z3jUYjcnJyIMsyu0OXiGJ5njt3Lq3yibnE43GUlpaOWf7tpinHMBwOB9avXw+DwYANGzawAeR3G170o51uvFzcbDYzl25+V0zlNsxzdu0uOlERUY/4OmRkZMBkMrGFo7W00EnL/Px8lUShZ7LUMjqKSUpgq/Z3cqmmPOx2OzN75+TkjKu9PHBIi1QURRZ3VBRF1TkYypu/rzbdcsh0LIpiykuRaewNBgPDr+iuFiK6x7WyshKCIIzpJQokGFtXVxeuXbuGBx98cNI3vFuhKccwAGDdunUAgBMnTmDTpk2IRCIMFKSLiHlpQO+ei1TEi8g8KEZ6r3aAx5Jy+IU8GZODZ0pUTzo7osfQ+OdUl2T58Wl4hqn1xOQZKX0sFgt3QfT426rNTxQTlykR49Irk/f6Tac8Yhj8Kdt0NwE9hqznhJaqHoQTXb9+nZnCb6ddIpXyphgMU5Nh1NTU4KGHHoKiKHjzzTexceNGNDU1sQtjZFlmsR5vxa37f/Q/mkyieXj27FlcunQJjz76KKqrqz8zEkbmdPfUM6uSDu7z+fD666/jJz/5CURRhM/ng8lkgtvthtGYuEe1rKwMTU1NcLvd+Pa3v81uCKuurobD4UBdXR2LbZkO8edSyCJBdaIr9fr6+lgYfb16k+6ttSDw/8uyjLNnz6K8vJzt2vS7HqrPA7LacrWiPm+e1XtXO3n1fBC05fG+CPQ/1VNr4eDT86H4+bR65Wj7iv9Nryw+Hd8P2vT8uzwWou2jZGot32f8iWY+VCFfj+effx719fWw2Ww4evQou3TqdjENGcnVjoMf/9/UYhg8ET7R1dWF3/3udzCZTLh48SLMZjPuvPNOxOPxUeYwOokYi8XQ2tqKeDzOTIvpEE0oOtItSRJ8Ph+8Xi/y8/NZnMf29nYVk6BQ/3a7HTNmzEBLSwusViv8fj+cTie8Xi8WLlyIS5cuoaCgAMuWLcOhQ4fgcrnQ3NyMBx98EH19fSgrK2NSlSzLWL58OWw2Gw4fPgyz2YyysjK0trZiwYIFqK2tRWNjI4v6FYvFcO3aNVRXV+Pq1asoLi7G5cuXEY1GEQqFYLFY2DWNOTk5sFgsaG1thd/vR3t7O+bOnYuuri7U1NTA6/WipaUFc+bMGeWpeP36dVy7do3F/ywvL8eNGzdw48YNXLlyBQaDAaFQCFVVVTCbzQiFQsjNzUVXVxdKSkpw8eJFLFiwABkZGbDZbGhoaMCSJUsQDAZx+PBh3H333SgoKIAgCDhz5gw6OjowMDCAXbt24c0334TdbkcoFILT6cTNmzdRWFjIAu9Go1HmwMbjL4KQcNYaHBwcvrbQnzR6vCRJKC8vx/Hjx/HlL38ZJ0+eZL85nU7s27cPRqMRX/ziFzF79mxWtsFggMViYYGEduzYgaqqqgmrbxOlZAxjSFHwXuu1qcswiAHQLq/dCbWDwO96PIA53jKJUVEg4mAwiFgshqysLHY4i/LW6rpGo5Ed6RbFxKXSRqMRQ0ND6OjowIkTJxhIm5eXh4qKCiYxaaUEijrmcDhw/PhxZGdnszBxbrcbsVgM586dU7VVlmW4XC7k5eWhtbWVORjZbDZYLBacPHkSgUAAHR0dcLlcyM7ORltbG6qrq2EymZgkwLeRvlOQHUmS0NDQAFFMxK90OBy4evUqFEWB0+mE3+9nfiNkZTEajZg+fTpjvJmZmczPhWfOeXl5aG5uhs1mU+FSvIRiNptVQChJhRTlCoDqukb68FYxPWmHLwtQO8pRH5AvDJXBO53ZbDZkZGTgsccew0MPPaTCXlJhKJNNyRhGU/8gbsoChM5QWMnP1L+x6b+dUrnspkvjSa/He5OZKSnvVKrHVKNk7ZvMdhPAzZ+vuVXSq5+e6pMq/VjvjFX+ZFJKV3aMZhjX/QFcHea//w9s+UrIOQXllwAAAABJRU5ErkJggg=="
    }
   },
   "cell_type": "markdown",
   "id": "43c827be-7ed1-4462-aa00-145bf5aac8c3",
   "metadata": {},
   "source": [
    "![image.png](attachment:ddf137c1-008e-421b-a0b4-a1b7cbe9a803.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "73ccdbd4-1f4d-4567-863c-728f2e9be41a",
   "metadata": {},
   "outputs": [],
   "source": [
    "input_ = keras.layers.Input(shape=x_train.shape[1:])\n",
    "hidden1 = keras.layers.Dense(30, activation='relu')(input_)  # 类似调用函数，将输入层作文参数传入该层\n",
    "hidden2 = keras.layers.Dense(30, activation='relu')(hidden1)\n",
    "concat = keras.layers.Concatenate()([input_, hidden2])  # 连接输入层和第二隐藏层\n",
    "output = keras.layers.Dense(1)(concat)\n",
    "\n",
    "model = keras.Model(inputs=[input_], outputs=[output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "4cfb9277-7f38-42bd-a686-9f96a2b3ec04",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"model\"\n",
      "__________________________________________________________________________________________________\n",
      " Layer (type)                   Output Shape         Param #     Connected to                     \n",
      "==================================================================================================\n",
      " input_1 (InputLayer)           [(None, 8)]          0           []                               \n",
      "                                                                                                  \n",
      " dense_5 (Dense)                (None, 30)           270         ['input_1[0][0]']                \n",
      "                                                                                                  \n",
      " dense_6 (Dense)                (None, 30)           930         ['dense_5[0][0]']                \n",
      "                                                                                                  \n",
      " concatenate (Concatenate)      (None, 38)           0           ['input_1[0][0]',                \n",
      "                                                                  'dense_6[0][0]']                \n",
      "                                                                                                  \n",
      " dense_7 (Dense)                (None, 1)            39          ['concatenate[0][0]']            \n",
      "                                                                                                  \n",
      "==================================================================================================\n",
      "Total params: 1,239\n",
      "Trainable params: 1,239\n",
      "Non-trainable params: 0\n",
      "__________________________________________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "5d13040f-ff98-4632-890f-ef27cd4fc735",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "363/363 [==============================] - 1s 1ms/step - loss: 2.0999 - val_loss: 0.7421\n",
      "Epoch 2/10\n",
      "363/363 [==============================] - 0s 758us/step - loss: 0.7135 - val_loss: 0.6092\n",
      "Epoch 3/10\n",
      "363/363 [==============================] - 0s 906us/step - loss: 0.6325 - val_loss: 0.5934\n",
      "Epoch 4/10\n",
      "363/363 [==============================] - 0s 804us/step - loss: 0.6073 - val_loss: 0.5690\n",
      "Epoch 5/10\n",
      "363/363 [==============================] - 0s 747us/step - loss: 0.5922 - val_loss: 0.5586\n",
      "Epoch 6/10\n",
      "363/363 [==============================] - 0s 733us/step - loss: 0.5812 - val_loss: 0.5487\n",
      "Epoch 7/10\n",
      "363/363 [==============================] - 0s 739us/step - loss: 0.5696 - val_loss: 0.5407\n",
      "Epoch 8/10\n",
      "363/363 [==============================] - 0s 758us/step - loss: 0.5622 - val_loss: 0.5324\n",
      "Epoch 9/10\n",
      "363/363 [==============================] - 0s 738us/step - loss: 0.5544 - val_loss: 0.5295\n",
      "Epoch 10/10\n",
      "363/363 [==============================] - 0s 730us/step - loss: 0.5513 - val_loss: 0.5208\n",
      "162/162 [==============================] - 0s 496us/step - loss: 0.5304\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mean_squared_error\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n",
    "history = model.fit(x_train, y_train, epochs=10,\n",
    "                    validation_data=(x_valid, y_valid))\n",
    "mse_test = model.evaluate(x_test, y_test)\n",
    "y_pred = model.predict(x_new)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0bbc4778-e316-4619-967c-01280f9d6aad",
   "metadata": {},
   "source": [
    "## 区分路径"
   ]
  },
  {
   "attachments": {
    "b7539c24-b888-4bb4-98ee-f698c4c14632.png": {
     "image/png": "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Z9iyZQvhcJiDDjqI66+/nqOPPtoKvGIGARZWgJxmZKeEIcPzOQMc1dbWMnfuXP7yl7+wZMkSVFXl8MMP5+yzz+aiiy6yMsU74S5Xdj1cwtgBmBGo9ZRtRKlfqK2tZfLkyfz73//myy//g67rFBUVcfHFl3Deeeex//77p3W5dtFs6xGNRpk+fTpPPPEES5YswTAMhg4dytlnn824ceOshMnO+Bcudh1cwtgBNKcEaE53sHLlSl566SWmT3+dn3/+mVAoxOGHH864cb9nzJgx5OWFEQJrl8MljJYQtp0VGT5v2rRpPProoyxduhSA/v37M3HiRM444wyKi4td8t1NcAmjTUif/MgwzBwkyWSSt956i+eee44vvviCurp6wuEwJ598MhdddCEjRozA6/U2LWGaM4q5nTw9hC06lj3qeE1NDdOmTePdd9/lvffeA6BXr15cccUVnHXWWfTq1avd6txV4BJGG2AYZoQqFDPuvmgKvb923To+eP8D7r33z1asyyOOOILRo0cxZswYevbsmUaKaBn1yUUqWuuShmGgaRovvvgiTz/9NP/9739JJpN069aNyZMnc8IJJ9C9e3cgfcIlFzsGlzDaAF0382+gmErM77//nnvv+TMffPAh0WiMcDjM6aefzvjxF3DkkUdaAWQkUtfX2anA3F2wO7kZhsE777zD448/zscffwxA7969ufvuuzn77LOBzJG2XGwfXMJoAxLJKOXla3jvvfd47LHHWbt2Hclkkt69enPFFVdy4YXjycvLs8LPyyWHFKddwth5sKdekG2raRqLFy/mgQceYOHChUSjUcrKynjkkUc4+uijKSws3EqpLtqKLkgY9vyc0gFM5riQzl/m/6qqsHjxYl5++RVeeOEF6usbUBQ49rjj+MMllzBs2DB69ChFcoFsSZMczAxd8m/qJLdthGGmbTStJKurq1m0aDGKAnvtVUZeOJegzKym6+Tl5RHOywe81sBKCY1PkkQ8Tn1DPXpT7g1/wA94iDSaUbIbGhqpq6u18pl4PD4rQK89R4uqmpndEokEsVjMyjoWCAQIBAKWpKUoSlO+FJ/l1erz+UgkEhYB5ObmZtwutecWMQwDv99vPbPdec8wDObPn88jjzxCRUUFP/30E3vttRfjxo3j6quvJhQKZdQZyd2W1uA8R97XbnlrP2b/zX5Mmsnby3OWvbNi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"
    }
   },
   "cell_type": "markdown",
   "id": "cb90b101-9f88-49c7-8731-dfcda37e99a1",
   "metadata": {},
   "source": [
    "![image.png](attachment:b7539c24-b888-4bb4-98ee-f698c4c14632.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "7ea0bf7a-1780-4833-ba45-480f96b31342",
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "5543b017-c357-4f53-a23f-aa46b0195150",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 5个特征走宽路径，6个特征走深路径，通过两个输入层定义\n",
    "\n",
    "input_A = keras.layers.Input(shape=[5], name=\"wide_input\")\n",
    "input_B = keras.layers.Input(shape=[6], name=\"deep_input\")\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "\n",
    "concat = keras.layers.concatenate([input_A, hidden2])  # 宽路径由此连接\n",
    "\n",
    "output = keras.layers.Dense(1, name=\"output\")(concat)  # 输出层\n",
    "\n",
    "model = keras.models.Model(inputs=[input_A, input_B], outputs=[output])  # 输入层指定了两个，因此传入训练集、验证集、测试集也要匹配形状"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "90e30519-179a-4f89-b8da-5d0556475817",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "363/363 [==============================] - 1s 1ms/step - loss: 1.8861 - val_loss: 0.7814\n",
      "Epoch 2/20\n",
      "363/363 [==============================] - 0s 835us/step - loss: 0.7410 - val_loss: 0.6413\n",
      "Epoch 3/20\n",
      "363/363 [==============================] - 0s 788us/step - loss: 0.6374 - val_loss: 0.5870\n",
      "Epoch 4/20\n",
      "363/363 [==============================] - 0s 832us/step - loss: 0.6015 - val_loss: 0.5628\n",
      "Epoch 5/20\n",
      "363/363 [==============================] - 0s 766us/step - loss: 0.5814 - val_loss: 0.5457\n",
      "Epoch 6/20\n",
      "363/363 [==============================] - 0s 780us/step - loss: 0.5643 - val_loss: 0.5323\n",
      "Epoch 7/20\n",
      "363/363 [==============================] - 0s 793us/step - loss: 0.5516 - val_loss: 0.5222\n",
      "Epoch 8/20\n",
      "363/363 [==============================] - 0s 796us/step - loss: 0.5395 - val_loss: 0.5113\n",
      "Epoch 9/20\n",
      "363/363 [==============================] - 0s 782us/step - loss: 0.5319 - val_loss: 0.5046\n",
      "Epoch 10/20\n",
      "363/363 [==============================] - 0s 791us/step - loss: 0.5256 - val_loss: 0.5047\n",
      "Epoch 11/20\n",
      "363/363 [==============================] - 0s 771us/step - loss: 0.5246 - val_loss: 0.4919\n",
      "Epoch 12/20\n",
      "363/363 [==============================] - 0s 830us/step - loss: 0.5145 - val_loss: 0.4879\n",
      "Epoch 13/20\n",
      "363/363 [==============================] - 0s 807us/step - loss: 0.5110 - val_loss: 0.4860\n",
      "Epoch 14/20\n",
      "363/363 [==============================] - 0s 807us/step - loss: 0.5074 - val_loss: 0.4800\n",
      "Epoch 15/20\n",
      "363/363 [==============================] - 0s 788us/step - loss: 0.5014 - val_loss: 0.4772\n",
      "Epoch 16/20\n",
      "363/363 [==============================] - 0s 840us/step - loss: 0.4990 - val_loss: 0.4743\n",
      "Epoch 17/20\n",
      "363/363 [==============================] - 0s 794us/step - loss: 0.4951 - val_loss: 0.4705\n",
      "Epoch 18/20\n",
      "363/363 [==============================] - 0s 785us/step - loss: 0.4919 - val_loss: 0.4676\n",
      "Epoch 19/20\n",
      "363/363 [==============================] - 0s 860us/step - loss: 0.4893 - val_loss: 0.4658\n",
      "Epoch 20/20\n",
      "363/363 [==============================] - 0s 799us/step - loss: 0.4877 - val_loss: 0.4641\n",
      "162/162 [==============================] - 0s 570us/step - loss: 0.4727\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n",
    "\n",
    "x_train_A, x_train_B = x_train[:, :5], x_train[:, 2:]  # 五个特征（0~4）\n",
    "x_valid_A, x_valid_B = x_valid[:, :5], x_valid[:, 2:]  # 六个特征（2~7）\n",
    "x_test_A, x_test_B = x_test[:, :5], x_test[:, 2:]\n",
    "x_new_A, x_new_B = x_test_A[:3], x_test_B[:3]\n",
    "\n",
    "history = model.fit((x_train_A, x_train_B), y_train, epochs=20,\n",
    "                    validation_data=((x_valid_A, x_valid_B), y_valid))\n",
    "mse_test = model.evaluate((x_test_A, x_test_B), y_test)\n",
    "y_pred = model.predict((x_new_A, x_new_B))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad6eca45-7c9d-457d-9aae-5d1c09bf3ba5",
   "metadata": {},
   "source": [
    "## 多输出"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bcc870ec-f79e-472a-8c69-3733819448b8",
   "metadata": {},
   "source": [
    "辅助输出用于观察网络的主要部分的学习效果"
   ]
  },
  {
   "attachments": {
    "daf45782-d21a-4706-ba25-69b14cb3eb94.png": {
     "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZcAAAD8CAYAAAC7IukgAAAgAElEQVR4nOx9eZwUxfn+08fcO3sfLMsCgoCcazgksigaRQwoKmjEM8YrKorGGDXeMRqjJsaDGH+JomJA8WsUjSgExYCKICAaRVhYQJZrD/acu6/6/dFTNdW9M8uCuxxJPx+Gnenzrerq9663hI8a24imqpiQH4TL5YIDB90NXTfwzTcb8MMf/hCnnvojfLthI/r3749/LX0foihAEITDTaIDBw6+B1RVhXi4iXDwvwdRFDBjxoXweDxwuVzIy8tDVVUVQm2hw02aAwcOugiOcHFwSEAIYZ/Gxibs2rUbPXv2xJ7du1FcXIympib87fnnYRjkcJPqwIGDToB/pzVNs/wGHOHi4BCAEALDMKAoKlRVw5VXXgmfz4fS0lLE4jFkZ2dDkiXs3r0HougMSQcOjnTwQkTTNNTV1cEwDBiGwfY7b7KDbodhEOi6AVmWsWbNGixfvgJlZWWoqKjAwAEDUVJSguLiYrz++utoaGg43OQ6cOCgk9B1HaIoori4GKIoWpRD+TDS5eB/BKIogBARuq7jX/9ainA4jG3btmHPnj0Ih8PweQOIRCLQdBXLli3DjBkXHm6SHThw0AmIogjDMBVHOxzh4uAQQIAkiRAlESNGDMdf/vIXjB9fialTz4FhGFi69F/Ys3sPtlRvwQknjDncxDpwwFw+hBCWvehkMaYgCALrG1mWYRiGpX8EQXCEi4NDAMH8TwAwbfo0EAJEIlFomoasrCzk5eVgxIhhOMM4HZIkHWZiHThw0BnwLrB0sVIn5uLgkCKpEMIwdOzavRt5+XnIy8sDYA5QRzt0cKSAt1ocHDgc4eKg20FI6qNpOnRdB2AGAwP+AHw+H3esk4rs4PCDChVCCFRVdcblQcARLg66HVT3I4QgkUiwF1UA4Ha7Icsys1ocTbF7QAhBLBZDbW0tdF1nKaMO0oOPuaiq6ozLg4AjXBwcAqQmV0WjURiGYbocRBGDBg1yAqaHCB6PB0VFRY4Q7wQEQYBhGBBFEX6//3CTc1TCES4Ouh3UocAsFkGArpsCZlzluMNH2P8YqIB3BMv+QQhhySWOS+zg4GSLdQPoxCKKA01nTA1mflALyd8dn3+gjMP+4tAUw0zH8u1of5wAentzV3I/AQQBkCQRBQV5ZpqiJEIUgGAwy3KdTMyPT33kj+d94+nOsbczHd2dvUYm+jL1l/1eqXOTfZjcbiT7J3kUSPI3Pb6rhIFjsXQe/Jhw+uzg4AiXLgZfX4e6f2RZhq7r+02zteeKWxmT6SOngksUU1oVzzQ6YqKdgZ2GdG0TRXNCJL23KIqMIRoGYdcwGaRJOz1HFEUYuo6NG7+FICRFJldKgndHWC0dvVNtpDTRa6Sjnz8uXRvTXdt+XkeCi+6jcQ1KDzvGIKira4Asy1BVFW1tbSgozEdBQb7lOCpoJOn7MzdHsBwcnD47eDjCpRsgCAI0TWOTi1paWhCLxRjDyyRA+O2qqqKpscU8BkA4HIaiJLBr5y70P7Y/du/aiT179yCRSECSJITDYcTjccbYKXOmmVl2+vYH3kqwM00eKSae0sjp+XV1dRAEAXV1taiq2oRwOIzi4mIMGzYMixYtgq7ruPnmm/Hhhx8ikUigqqoKNTU10DSNzfwVBAFlZWWora1FQ0MDC0xTmvj+o+fY+5QKGb4v7BZYJqFC+5EV40vew36sXdOlQph3RQmCmCzMKUAUpaRAFpIGqc7OAYD77rsXv/zlL+H1evf7rBw4OBIhOOu5dC2oxWIYBkKhEB588EG89dZb2LVrVztmuD8IgttyXVmSTMYmCCBEBSFGRiZ5IKBaLS3jIEkSRFGEJEmW2beiKMLtdsPv90NVVXg8Hvh8vmRGjQaXyw2Xy8WEq2EYcLlckCSRWV68oMokZPlMJt6C4dGRK0oQBHi9Xui6bkkj9fv9EEURqqrC5XLB5XJBFEWEQiFomgYAkGUZbrcbuq4jHo8DALKzs5GVlQXDMKDrOqLRKKLRKHRdhyzL6NmzJ/r06QNFUdDc3IzGxka0tJiKgSRJKCwsRF5ePrxeL1RVRSQSRSwWR1tbK2KxOLxeL3JystHa2opoNILt279DW1sbbrjhBjzxxB8hy87EUgdHF1RVdYRLV4MysubmZvz0pz/F4sWLceyxx2Lw4MEYMmQI8vLyEAqFoCgKVFVFIBCAy+WC2+2GIAhwuVyMwWUH85GdnQ1N0xCPJyC7JLS1tkFVNYiSgfLyXoxBU4uId98AmeMJ6Zg8deGZAkFi31NuLoEJFMpYCwoKkhWPFbjdbni9XoiiiFjMtKL8fl9aIWK3DnjhaC8jQY/PFG9Jd+1MQslubXQ2XmK/j71NmeJEdL8pMAXOquGPt567ePFiXHfd9di5cyfmzZuHiy5yaq05OLrgCJduACEE4XAYM2bMwOLFizF06FC8//77KCkpYcdQK4Bn2nZQ3zzP3wgBRJGLY0gpBnooStVTt5Ld9aPrumXs0PhLJvDxKEmSjiq/dkexl/2dZxiEBepNgQqkkjZSz88wDMyb9yquuuoq9O3bF5s3b+raRjhw0M1wVqLsJlRXV2Pp0qUYOHAg3n33XZSUlFiYER9wzsScTPeXyaQF0fxAMGAQAxAIRMl8dIcymyVTAFySJJZa3BmvHKVZkqSDcuMdCbDHdjqDSCSCr7/+hutHI/mxXscwDJx//nSUlJQgHA53Cb0OHBxqOMKliyEIAubOnQvDMDBr1iyUlZVZ3D70uz1QTGGdOW0KEsBIZlwBgkBAiJH8kC61WPhMN0II6uvrkUgk2D6KRCKBefPmYcuWLQBSFg0lPZWObF2Zjv+9du1arF27Nu197efxiEQibJ9hEKiKhkRCRagtjLa2MEKhMKLRGFpaWvHddzsQj5sVAQh/H3x/gaaq6gHNcicECAQCGD58eFIAk6QFmvrQLzS2ZQrt9gkZDhwcDXCyxboYNEOLEILBgwdbhIkd6SwBmq5s30d/dreRwqf8nnTSSZg8eTL+8Ic/WCytjz76CD/72c9w5ZVX4rnnnmOuLT7GwKdj26unCoKA008/HeXl5fjPf/7Djl22bBkqKipQUFCQ1qr7/PPPccstt6Bnz54QRRGaKiEajUPXNbQ0t8AgBkRRgs/rRUtbE7ZUb8byfy/D6DGjkIgn4PG4QUAg7meuUEegNPH10DoDM8ZC70vjOanfIAARCEB0AAZAzFRkt9vJFnNwdMKxXLoYNAW3qKgIpaWlh5ucAwYVElu3bsWuXbsQDAYtltaqVavw85//HLIs49NPP2XlXOyg26qrqzFp0iS8//777VJ+TzrpJHasIAiYOnUq5syZw6w8+3W/+eYbfPXVV8jPz0ffvn3Ro0cRBg8egNMnnoqzpv4YJ5wwCiNHVmBc5VhUVIwwhTxMg0BVNXYd00A40txxSWEjiiAQICZdhm63e79nOnBwJMKxXLoYhBCsXr0aZWVl6Nu37yGNiXxf6LqOhQsXwuPxYMWKFVBVFZqmYeXKlcjJycGgQYMwbdo0jB07FrfccgsuvPBCXH/99XjxxRfbXYu2ef369fjoo49w9tlnt5s3c/zxx7MJkoApZGh8Kp3lEovFkJWVhWeffRYAIIkyANM9Zq52SVk0wcZNVXj11fmmRUCArCyzPpQAM94lAJaYz+F+RppuukAlSQQRJOiGSXePkqLDSpcDBwcLR7h0AexzNGpqalBSUnLUaZ3xeByzZ8/GunXrkEgkcMopp6CxsRHnn38+WlpakJeXhxNOOAEvvfQSsrOzMWvWLDz88MNobm7GNddcg9NPP52lIlNmrWkaBEHA9OnTWSIDdb2JoohIJIJoNIqCggKWis2fT+cMUUGwb98+BIPBJMUkOSkxBSbARNm0wsSkMBFEQCAQIJguqsNkuKS3mAgkUYQBAp2YWRybNn2LSCSCcSc6tdccHJ1whEsXgJ+fQV05Ho/nqLJaADPgvHTpUrz00ku44YYbcN9992HIkCGYNWsWZsyYgW+++Qb/+c9/cOutt0IQBNTX14MQgurqakyfPh2nnHIK3nrrLWRlZbWbT1JaWsr6Y82aNVAUBdnZ2VAUBbFYjMWq0sVu+Dkr2dnZ+OMf/5i8bvv5PBQEAjweHwYMGABNUyGKHkiiCAJTwPCTTw8XLHN4REBJqIAkQ5REfLtpM5pbWlDiWC4OjlI4wqWLYJ8hP2TIELb9aEI8Hscnn3yCyspKTJo0CUOGDEFNTQ0mTZqERx99FEAq/dgwDMycOROVlZWYP38+NmzYwAQsX0eNzv3JysqCruuoqqqCJEkYNGgQ8vLyEAwGsWbNGhb4t9fm4q/jdrsxffp0rF69Onk8nTMD5hoTBEBRdfh8AWRnBxEOR5LzcI7gme4EiCcUxLU4/AEfVFVL1l1z1l1xcHTCES5dAJ4Z1tXVgRCCMWPGWGIMRwsWLlyIlStXYunSpTjxxBPx+OOPo7q6Gm63m1kqAHDGGWegR48eEEURjzzyCKqqqjBnzhwAaFek0zAMnHzyyZBlGUVFRfD7/UgkEpg2bRpycnIAAHV1dawECz8xlHcjff755wgEAqipqcGPf/zjjOnKACCIMnqVlWP5in+jd2+zkkEqBfnIeh60eKfX60Xtnlq4vS4zc8xWr82Bg6MJjnDpAvDum88++wwAEAwGjzrB0traioceeghDhw5Fz549EY/HEYvF8NOf/hSVlZX44osv0KNHD9TW1uL999/HxRdfjD/+8Y/Yu3cvtm3bxtpKS8YYhoFp06Zh69atrE6Xx+NBfX09ZFnGT37yE24Spo5AIICpU6eyAL89drNy5UpMmjQJgwYNwjPPPIMBAwagX79+iMfjqK+vR1lZGTweDxRFSc53iaC8V8/9suiDnXXfVTAA6KIASRZRnJcHQdUgGslUbuFIy2pz4KBzcIRLF2Pnzp0d1qU6khGJRFBTU4NIJILS0lKEQiFcccUVmDRpEgRBwKxZs/DQQw/h/PPPhyAIaGxsRL9+/WAYBsuM4+e0bNq0CXPmzMFvfvMbBAIBVvLmr3/9KzweDx555BHLvJq33noLt912G37729+isLAQQPtkib59+2L37t2YPHkyE0ySJOGYY44BYGaUeb1euN0uNDcnsGDBAkyePBm5ubkQMogYmgqdSCTg8Xi6VbhkrMiQXK1TFARIkozGxqakRDx6lBMHDng4wqULwLvF+BnVmYonHqkoKirCwoULMXLkSPz73//GDTfcgPXr10PXdZx//vlYvHgxtm/fjiVLluDGG29ka7GLoogf/vCH7YpM7t27F08//TRuv/12iyXHl8ABUsx93bp1+OSTT+D1ei1xG0EQsGnTJrS2tqKhoQFDhgyBqqrwer1QFIW54crLy9HU1ISSkhK0tLSwZQ+8Xi+mT5+esd1UGdA07fBk+AkCBELQFo6isaEJpaXF2PHddyAGQSArcOjpceCgC+AIly4AHyPQdR1utxvBYLDDhbcON9IJPZfLhYkTJ1qEZFZWFtra2kAIwbnnnosTTjgB7777LrZu3Yr6+np2bGlpqSUDiwqS7OxsyLLMtgNILnYmsv6iacm6rsPj8VisHHp8VVUVWlpacNddd2H69OlMuJxzzjlobW3FM888g8rKSixcuBCXXHIJotEoYrEYfD4f+vXrZ5lfw9NCIYoiSzg4HCAAsgI+tLWYiRK1tbUQBKC8vPyw0NMVSFd9+kh9Hxx0PRzh0kWgzGv16tXIycnBmDFjjoqYC1+qZdWqVfj2228RDAbx/vvvIxwOo6KiAjfddBMEQUBzczPL9GpqakIkEoGqqli+fDlOO+00i+WiaRpCoRBGjRqFQCDAtguCgM2bN6Nv374AwApYUkFM15IBrAtzvfjii+jduzd8Ph/GjBkDwzDw8ccfo62tDXPnzsV5552HDRs24PHHH8fmzZvxt7/9rV0GXybwrjwqCA81YrEY/F4fAoEsiKKEPXv2ABBwwgknHBZ6ugK0ysL+VmB18N8JR7h0AaibhxCCL7/8Ej6fD/n5+YebrLTg5+TQ39RqmDFjBurr6zFkyBBUV1ejsrISTz31FGRZxhNPPIF+/frhgQceQDAYRDAYhKZp0HUdmzdvbsdARFHEP/7xD/To0YOtpkhdYZqmYdCgQVBVFaqqslpsNTU1AMAYEq08/OWXX2L58uW46aabWGn/rVu34qqrrsKcOXNw7rnnQtd1DB48GPfddx/uvPNOTJ8+HRMnToQsy0eFgK+rq0Of3n3g9rghyzIi4QgAgry8vMNN3kHDXlPvSH8ODroWjnDpIlCmrSgKfD5fu3XmjxTwLgre/SUIAl599VXs3LkTF154IS644AKMGDECAwcOxIoVK1BXV4dHH30UJ554Ip588klMmDABt912G9xuN7Kystq5b0RRREtLC7Zs2YLrrruObVdVFW+++SZEUcR5552H9evXo6GhgdE1efJkAKkCmrFYDPPmzYPL5WKJBOvWrcOFF16I2tpabNiwAcuWLWP9vW3bNgDA5ZdfjjfeeAMnnXTSEa85CwD6lPcGCCAKAtxuOVmh9OhMDKHglS4H/3twhEsXwF5WnjLajtZrOZzgYyN8PGT8+PFM2GzatAlDhgyBJEn45JNPkJ+fj88+W4U///lZZGfnID+/ALt27cbNN98Cvz8LZWW9LPcwDAOVlZWIxWLYsmUL/H4/jj32WJx88smYNm1aOyEniiJmzpzJ+ozuf+yxx/C3v/0Nzz//PI4//niIooh3330XoVAIY8eOxfLly1l7CgsLMW7cOEydOhV33XU3HnvscUyYcAqbWNk5EHRUG4YQa9KC9fl2NOGxo4RoAley3bLfAwEEomBAEAj+GzKRj8R3wEH3wxEuXQD68uzcuROqqrJ4y5FmtVBkKn3Cl1qhcRMaZO/Zsyfmz38VW7ZUMzfUhx8uQ2NjI+666y4UFxe3u8/tt9+OX/3qV6wkP7/yJu+W4+MqND5DceGFF6KiogJTp05lx99xxx245JJLMGDAgHalYqjFM2rUaASD2e2EAFWiD/axdMdcGGKkYhMSyzA0PweyZowDB0cSHOHSBaCM84svvkAoFELPnj2PSKHSGVAm/ac//Qn9+/cHAEydOhUDBgzA6adPREPDPhQU5CMYDGL16lUQRZFVMk6nmVOXlL1GGA8aWznllFPYsYDZr8cddxwGDRrEjpMkCR6PB/369bNcg1o6LpcLhBCceOIPWVFLU4CBEwoHbw7wVZy7yt1GM+cAk9bGxkY0NzdDFMUj3qXnwEEmOMKlC0DdOuFwGIZhYPv27RYmmrFEiS1Fkz8u3W87OrO/IyGX6d4AcPrppzMXFWXwgiAii827ENCrVy9W9dis65W6nz2Qa78+nxpMGSidl0KzxOgx9irJfBYZD8r4TSEiWqyT1HfrbPx0z8bcbj2X/rYLyfbPrN3luGt0Tqj96U9/QnV1NW6//XaWwODgyIL9WR6tymR3whEuXQDKpCorK5Gfn4+VK1cikUiw8vGUUXYUg+GZJc8k+et3FvRa1Aqhbim6jcLOYHlGzx+bioHwQoOWepFhGCQts7Xfh17LTidfNoYi0/LNlL50Gj1NZTavbXVLGgaBuUR0eoHK90X7fkhZO1S48e689ooApT1VFkjX2895oufR6yQSCbzwwguYM2cOhg0bhl/+8pdOMPwIBP/MgMxj9X8djnDpAtA6WuXl5fD5fNi4cSP+8pe/4JprroHf72dMxC5o+BhEJk0oU92r/WlOzc3NyTIo7rRWlKZpiEQiiMVikGUZOTk5aed4UNp0XUdjYxMSiQQIMSBJ5rHxeAyRSBSJRBzRaJT1RyAQgKqqCIVCAFJLENB2KIrSjqaugmEYiMXi2LHDLGUDmNlnZWVlaGzcB7/fj379jmGFRqPRKBoaGrB7927EYjFkZ+fitNN+hGAwm7niUv1rIBKJQBAE+P1+7Nu3D9u2bYPf70deXn5y8ixBQ0MDe9Y5OeZE0ljMnNhJrVy32w1d19Hc3Izm5mZs2LABq1atQl5eHmbPno3c3FxHuByh4CcKO0gP4aPGNqKpKibkBx0T/CCh6zp0XYcoili0aBEuuugi6LqOY445Bnl5ebjooouwdu1atLW1wePxID8/H4FAALW1tdi2bRs8Hg98Ph+bVe71etnv1tZWCIKAvLw8uN1uhMNhRCIRVuyRX8WRRywWY/GJTHEORVGgqipEUYTX692vfz8eTyAeTzDhCJipxYlEArquQVES7KXzeDzQdR3xeJy5tigdkiRBUZROT3I8OKTiGFSQu1yupFAzV3yk1qH1/mZWF5+AYIXRLjkBoMJfTGampRgPPY4Qg7nmeEWB7qdW7aRJk/DUU0+hvLwcuq7D6/U6DOwIA51y4HK5LIqjgxRUVXWES1fAzthfe+013HHHHaivr4eiKJZgLf1rzziyu814Nw3PiFLaUirrqr37LLmdDnh6X5iFEc115Q2IAhc7ALV+CP3HxQkEQAC8bo+FBlmW4fP5WNn8SCTChAYNUrvdbvTrdwwGDhyInJwcvPbaa5BlGdOmTWP90traiqamJni9Xng8HkSjUWbZZGdnIzs7m9X86rzGmN6lmDo/lYjB7xNFCS6Xi1lxtH4afSYul8z2xWIxqKrKPcOUa04QBLbPTDIw2JIC6axPSZIwZcoUjBgxwqIQdHVmmoODAz9OEokEnnzySdx+++3t3M4OTDjCpRvAp8SuW7cO//nPf5BIJNh+ytx8Pp/FZUYHaSAQgMfjgdttztROab6EubH8fj+ysrKSTMtkTMFgED6fz1xmWDIZoNvthsvlgiSJLGZCBQYfpOZphygmFxhJbgNhOWACSQqnNIkE9hRfPgBuGKn6YVdeeSUURcHcuXMtAXteiPIrUtIYB3+MAweHGtT1LQhmEdVx48Zh6dKlGDlypCNc0kBVVSfm0h2gDHHMmDEYO3Zs2n1Aylqh39MFm+3B8FRA2fytaZolAG1mbQnQDaopE6iq6TpTVYVj1kIyyG3W05JlGZpuQFUU6LoGwzAFiYerUOwSAFXTLCmyKTr56tB0O2GavGEYaG5uxrp167Bx40Y88MAD7dKJ7do6/3FiDw4ON+j79/e//x2xWAxbt27FyJEjHaUnAxxHYTeA979SocEHs9N9B6wukHTZVdaMrNQkO/pbFJNWBAzQTCVTgAGSZO4zy9OLSCQUiCJN2TX3yZIItyzD43LD43LBJcuQBAFuWYIsChZ3F82YSdHJtx8QBDOuQSEIAubPn49NmzbBMAxs2bIlrVuP7z972q8DB4cLvCX97rvvQpIk/N///Z/jtuwAjuXSDbAPuHQCIlPsIJOvnT+WP8btdrW7hwhAlEXIssQxZgGBgB/U3+XxuLlz6F8CUZQgCO2HBSGme4wP+vPCgKcJyeNM4WD+bm5uxssvv4zBgwejrq4OCxYswBlnnMEECT2etYG7piNgHBxuULfYP//5T2zduhX9+/fH8uXLUVVVheOOO84RMGngWC5djHQunXT76fdM56fbbj2GwMxcIuw7+wiwHSskA9ip33wNL/u+TO1Cmral2tKeDrrNMDQ0Njbi66+/xsCBA9G7d28sXryYWUF8f9j7J913Bw4ONah7d9GiRcjNzWWK0b///e/DTdoRC0e4OLBA2M/nYKBpOi644AIUFRUhFAohKysLsVgMy5cvdywSB0cFDMNAVVUV3nvvPRQWFqKgoADBYBDPPvssm8vlwApHuDjoItjde+aseMMg2LlzJ7799luUlvbEjh01KC/vDVEUsXXr1nYZaw4cHImQJAlvv/02DMOAx+PBqlWrMHz4cGzcuJFN1OVjqw4c4XIUQ8z4ESDs1wLpSsvEhMDuT4jABIuiqLj77nvRr9+xKC3tifr6Bpx44jiUlpZhwYL/c15EB0cF9u3bh1deeQXHH388CgoKoKoq+vXrB6/Xi08//ZRNZnbGcwqOcHHQLaBxnbq6OnzwwQcoLS1FYWEhevbsiYaGeuTl5eHrr7/G5s2bDzepDhzsF4sXL8aWLVugqipbRXXbtm0QRRHvvfdeu+xJB062mINuAn3R7rzzTsiyjOrqanz22WfweDyYM+dFSJKEtrY2vP322xgyZPDhJteBgw7x8ccfo1evXti+fTu2bduG+vp6lJSUoKCggKXXOyVgrHBm6DvocvDzeNasWYOCgkL07FmKyZPPwt69e7FixXLk5+fh448/Rv/+x6J37/L9X9SBg8OISCQCv98PwzBw5plnoqGhAevWrQMArFmzBmPHjrVM9v1ft2CcGfoOugV82vAJJ5yQdBkQ9OjRAxs3boSiJCDLMk499dTDTKkDB52D3+9nk3r37dvHaugBYIIFcIQKD8eOc9DtMAyCaDSKnTt3shpnDhwcjTAMA6FQyJnY2wk4wsVBt0MUBYRCIWzYsAF9+/ZFfn5eF6Vtku/xceDgwMeIIAiIRqMoLCz8H7BSvt875LjFHHQ7CCFQVQWtrc0oLi6Ez+dDS0sLK7F/8C/p9xES/+2MwUHn0NEYEizfaSXxeFxBTk4e2/bfPZY62z/t4VguDrodfLkZCkII3G73/4D25+C/BwJbKKykpJgJG8cSTg/HcnFwyGAYBltY7PCusOgINAedAbF8TwkSHeXlvbjq5OnGkzPGHOHSBbCXzafg11/p6Lx0xS35fbSsPtX++YW1+JiFfe2XdNv5benQFQzffm3DMBCNRiEIAvr37w9BEOD1etNWerbD3n/Wfm5fWZov059uX+p35vanWwyNp4fPhkv3e3/XSfc86DLZFId6zgSdBGivcE3X8jlaUmzTjSN+jLXve+t7lNpvFmG1jj+6yB5BUVEBBIGPG/JjUQQdX/z7ahh0m5VWfvx0NPa6E3zfpGgB+BVd+WOT3zKuZUMIcYRLV4Bfx54KAFEUoWlau1LywP4Hjb0sP//C0790tUb+erxQ4tdE2R8DT3fvzh6fqU26rltWlNy0aRMkScLIkSOh6zoSiak9dv0AACAASURBVAREUWQLlfH3tDMDwzCg6zo0TYPH4+H28YKdJPsaSCRiyTlbAhKJOAxDh6pqEASBoyvVX5Sx25mqPSOIbufpo/0sy7JlSWT7InCiKLL7uFwupjDQ47Ozs9nY4fvjUENRFMiyDFVVoes62tra0io/RzoyrQXE/5Ykc7VWfpzx4wlIVQtXVXPs6boOQgQ0NjYjGo1B13XE4wk2jmVZhtvlgSCIEMXke2AkV2OFAEFsX5kcsColFPbl07sDdl5Dt/FCkX9HUnEmMP6maZpF2aVj35lE2QXgO1/TNEQiEXz33XcA0I6x2zWAWCzGUhvdbjdEUYRhGFAUBX6/H9FoFHv37kVDQwPKysogyzIURQEhJjNNJBIIh8OIRqMIhUJQVRVacrVIAAiHw4jFYuyePFPjNRW7ps3TeLDYt28fgsEgPB4PNm3ahG+//RZ5eXkYN24c6urqIIoiCgoK2BwCCvsg1XUdra2tSCQSKC0t5bQsc22ZaDQKXdeRlZWFaDSKcDiM/Pw8AMDu3XvQ1taGhoYGyLKMRCKBeDyGRCLO7kdX86TCkGdMdiuS7xN6jCRJKCoqYs+AEILs7OxkIoPKBIvb7YaqqsjPz0coFIKiKFAUBW63G+PGjcMvf/lLTJw4EbIsH3IGTtueSCSgKAruvfdefPnll1i7di1isVhGa/BIBSGELRNuH1uUsZeX90ZOTi40TWPvTjweT7ZXgiCI8Hg8zPIuKSlBwB/Apk2b4PF6MG7cOOzevRuNjY2QZRkFBQUoKipCXm4esrIC5ntGDETCUWiaBoMYkGURHo8LsiwzJYPSla4N3Q1ZllFUVISioiIAgMfjgSRJ8Hg8SCQUaJoOn88LWXaBugZ9PtOlrWnmWD7ppJMQCAQsVryu645w6QpQy+WTTz7B448/jl27dmHDhg02Tag9eIsj3SBLb66n0BlXhX3WMP3QgbA/S+VgB7jdmuKZNe8C4ttNBSsN9lPG7HK54PP5EAqFIEkSE+Ky7EZWVhY8Hg9CoRBisRg8Hg8IIezFVRSFnUOZjaapEATA7XazTyAQgNvtRiKRYMLO5XJBVVVEIhFEIhHIsoxAIICsrCy43W7IsgyfzwdFUZgl5na72YJqtA927tyJ8vJyyza+3aqqYtWqVRAEAc8++ywuvvjiQ+4Wo8IlEonguuuuw4IFC5CVlYXRo0ezNpla+5EfvM6kKNn3mauxSkyYU8VMURRIogxCRAiCCN3QYegGvF4PfD4vDIOgvqEB8VgMkiTB7XYjGouBGAYEUYSSMJU5j8eDHj16IBqLonFfI+LxOAAdoXAbAJOx0/dCVVXm5dA0DYlEAqqqHpL+Stc/1O1M3WJ2/iMIdEl1glGjRiE3NxfXXXcdzj77bEe4fF9Q5kD/vvDCC7jtttsQjUaZJutyueD1+uDxeJCVlQW/P8BWZgyHIzAMHaWlPeByueDxeJg7hFoWiUSCaThAJr9nCrwFki4OYRgGXC4ZAIGqapBlc237YDCIHj1K0dbWilAoAkVR4HK54HK5kJubi7y8PPh8PhiGgebmZhY7yc/PR2FhIbsffVEURUFDQwN69uzZjm6eVkqbXcjaLQZKSywWY31hCigJPp8PkiQhHo9DVZWkUDGXWKaauCzLkCRTEzX7VmfuJ0mSmKYmyzI0TWP3oCa/oihM0FGh4nKltE9N05hrgAoyvm2NjY0oKCjIqARomoZXX30V1157LUpLS/HRRx+hrKyMCalDIWio6/GKK67A/PnzMX36dNx1110YOnQoy+rrjDLTkXVzKCyejmi0vzP0mVL3lK4b0HUt5XImAgTRHJOGbpguL48bhmEgEo5AURUIgrniq6pqIMRU2HRNAwHgcrmQnR2EopgKiqooICBIJBIAwMYKFSi8pa5pWju3WEfxDbsbi0LTNPaXunqp8GptbUVTU1Py3VFZXJRe03RfKwiHQwiHI1BVhbs2Tc0maGtrw7vvvos+ffpg8eLF6NOnjyNcDha0g+kDmz9/PmbOnAlRFPHAAw/giiuugCiKjKHRAWgOJCR9sQYIMdjg5leGpPegPs10zGV/7rZMgkgQAF3XmCbKJwmY+yV2Dr8/nbVDg73xeBwej8fCVA3DwJYtW9C3b9+0c1kyMRqqHfNWDP0dDocRCATYvV0uV9p267rOGDMfA+kK5tZR/My+j96b0p+pD2g7//CHP+Duu+/Gaaedhvfee4/176EQLrqu4/XXX8dll12GiRMn4uWXX0Z+fj4AJMdx5/puf5WBjwaX2tGO/VmXdm+IXSB1VpGgz1rTNLz//vuYMWMG+vfvjyVLlqCoqMiZ53Kw4Bnt4sWLoes6nnrqKfziF79AXl4e8vLykJWVBZ/PC1VV4fG44Xa74PG44HK54fF44PF4WRDQLlw0TUM8Hk8Fx2xBbt7dRs3qeDzONBU76PnhcNgSbOeDyvaBxAs9qm3x7U5ZQ1YmT9vh8/ks26lG1hGo9k8Iwd69exGJRNg9Y7EY3n33XQtTVlUVqqqybfX19Sw+QwPsdtdfVwRK6ZrqPOz34e+lKEqH19N1HTfeeCN69+6NlpYWixZ5KEAIwfbt21FQUIDZs2ejsLDQoix0Fvw4pXGMdNa0g+5DZ/qZvmcUvJKZzlWeaTtguvemTJmCV155BVu2bMGePXvMa37vlvyPgj7A+fPn44033kBlZSWmT5/OXiLKVKif38wsMaCqGovR8FqDXXMAgL1797YTJtT9xJ9PmTyQCjLzjJx3O1F3DiEEGzZsYJYCL2js9+EFiOk3NoWfqqpobm7G7373OzagKAghKC8vh8vlsjBZPjAcjUbx2WefIRQKWawU2hc//OEPcdlllzE6iouLcdZZZ0GSJObSosKZnpOVlYVAIMAEdiKRYP3At89OK/1rF9qZBBEvPPhnQxM0aH9u3ryZ+fPt1+eftyRJcLlcOPnkk+F2u9k8oEMV46BjyePxoKSkhLWRV3gO9Hp+v589/85cI53idLjA02Efm+k+B3rddOOwK2kHMgsZ/pl2xH/SWdr8h7+XKIoYPny4dVtXNeh/DZT5btmyBQBw6aWXIisry5KKTDXw3NxcxOMJxGJx5mJIJBTmo21oaICqqhY3SjgcxoABAzh/sJ6W+UUiERBCkpaQh91bVVWWJcavkkf95/F4HCtXrrS4uHgmQAjB6tWrLcIHAEsFpkLq/vvvx4MPPognn3wSuq6zTDZqVQiCgNraWoTDYbS2tmLNmjVM69+4cSPGjx+Pa665Bk1NTRZrauHChdi3bx+zmCidVJDYBSz97vf7WQBaEAQEAgFGM5CyxnjQeIO9b9MJF3o/PhhLj6NCmKa3iqKIHj16gBDCsmkyMRUq+Kl70eVypaW1u0DbIooifD4fABwUA+SZDw2Ud0ZA8f1Is/cOJ3hagJQyRbfx6fEHKlzsaejdAfv10wkGup33mtD3hudj/F/+PBqvpPtcLhf8fj9LRHCESxfA6/XiuOOOa2f+0xdGFAV4PG6Ew6HkQBSwbds2tLWFAYC5cPgso0AgYHH/xONxC/Oj+xKJhMVSottpBhT/0tKXg2qoJ5xwQtpJivQaeXl5zO9PwX+/99578eKLL4IQgi+++AKxWAzxeBwtLS0spVMQBBQVFSUTGvw49thjmbDs1asXfvzjH+ONN97AJZdcwpjv2rVrceONN2L06NF47bXXLJYZYJ1DQ2lO96Ly/ZVIJNpNeOzoeF6YZUK6F5YG/Sk9OTk5LIgaj8exa9eutAKLtquxsTHj/bob8Xjc0pZoNMqEe3eD9v3KlStx++23HxEuNEII5s+fj+uuuw7HHXcchg8fjttuuw1ffPEF8w4crFVHr99dsHtQDgXMOT9xpsA6wqULkJ+fjz59+lgGja7rllRCv9+PoqJCAIAgEBx33CAEg1kwDAPl5eVsxjoFn6Ejiql8e0EQmLUCgM2nIMTM2uBdQPQYKhBcLhezpmRZRkVFBWpra7F48WJ2X96FM2DAAMt23o3317/+Fc888wx+9atfYePGjVi1ahWefvppeDweqKqKlpYWZg1QLZxmn7W2trK04ueffx6zZ8/GySefjFAohK1bt+Lqq6/GMcccgzfeeAO6rqO5uRkbN25klhh1ifGC1q5VxWIxlsFFLTbe0uBBz6VrdPDuoM4ygNraWqxbt44JOt6aMgwz08jr9aK8vLwdQ6I0JRIJrFy5slP36w7QJad5V0l3um940Hveeeed+Oc//4mGhoZuv2dHUFUVN9xwA2bOnIlvvvkGV111FS6//HJ8/PHHmDBhAm677bZ2GaOdgem1SFjihF0Nnp5DmdJOrTr23nzU2EaW1jYSRVGIg87BMAyi6zrRdZ386le/Iv369SMNDQ1E13WiaRoxDINomkZUVU0ea5BQKMx+a5pGdN38S4+nH13XiWEYlnvx3w3DINFo1HIO/ezcuZM0NzcTwzBIIpEgsVgseS/dQrNh6MlzdKJpKolGI+w4XdfJzp07STweJ4qiEFVVLXQqikLefPNNUlxcTM4880wSi8VIPB4nt956K3G5XOT3v/89UVWVqKpKQqEQUVWV9YumaWTz5s2kqKiICIJARFEkRUVFpKysjLjdbuL1eokoikSSJDJs2DAyfPhw4nK5iCzLRJZl8uijj7K20I/9mdBtoVCIxOPxdn3E9yNtr67rRFEUsn37du756O3uwd+Hf5aappFIJEJqa2stdPAf2g+pZ9D+uba1tREAZMKECRYaDwV0XSdjx44lffv2ZfTRZ2/vt668ZzweZ33Y0tJCJEkikiSRv//974wO+jwURWFjie9LSqe9f+l3uo/eJ9OzpcfH43Eyc+ZMIkkSWbhwoeW6mqaRK6+8krhcLvLMM8+0uza9Lk+P/R245557yO9+9zvLOXb67G23080fZ2/7nDlzyEsvvZR2rHUXDMMgGzduJADI2rVriaIoxLFcDhJU6/jyyy/h8/mQm5vLtpOktUEtBkIM7N27B3V1dQBoZgbaabiZfJv8d0FIZWHx2rWmaQgGg2wpVt5/b9fGzfRo868kyfD5/MzXqus6AoFAO1eZYRiIxWJ47LHHcPnll6OkpARPP/00syLuu+8+TJo0CXfffTeuv/56fPnll5agNElqv3l5ebj22mtxzz334I033sDdd9+NlpYW/OIXv8A//vEP/POf/8R9992HzZs3Y8aMGXjzzTfxj3/8Az//+c9x4oknWvzDmXzHANjkyky+ZnufyrKMXr16cc8nfVCTP48kY2P79u2D1+tFcXFxOx8278umc2YygT4juxvwUGH37t0Wdwo/JrqDHkEQWPJDKBTC5ZdfjhNPPBEAsGDBAub+5I+nY4mOyUzJGnV1dZZYI78/XaYfkJpasHjxYrzwwgs466yzMGnSJAsNhBA89thjyM/Px4MPPojq6mpLwN+eiUnPoePok08+wd/+9jfU1tYCgCWjkT+exnRo/9NnQr0BtA30ftTboKoqnnnmGWzatClttmR3ot19HMvlwMFrlcFgkAwbNsyiVVCtlj8uEolktDi+r0bIa8bUuuC1N8MwLJp8R9exa3qRSIR8+umnZPbs2WTUqFHE5/OR888/n+zZs4dZZ/RvY2MjeeaZZ0heXh7Jyckhl112GVm4cCGJx+NMi0okEpbrr1y5kvh8PvLdd98xLW/RokVEFEXS0NBg0fq6SgMzDINZXLzGx2t6mawGuo9adYlEgjQ2NrJn3tE94/E4CYVCaS0XTdPIN998QwRBIBdccIGFnkMBwzBIYWEh6du3LzEMg7S2tlrGA2+9dBV4a2T27NnE7XaT1tZWMnnyZFJcXEy2bdvGrGBKx4oVK8ioUaPItGnTSFtbG1FVlbzwwgvkBz/4AfnpT39KNE0joVCIDB48mIwZM4ace+65ZNGiRSQej5NRo0aRkSNHkkWLFhFFUdq1hZ77ox/9iAiCQJYvX05isRhRFIVomsaeuaIo5Gc/+xkRBIEsXryYqKpKfv/735NRo0aRJ554go3z66+/ntx///1kyZIlRFVV8sknn5DCwkLi9XrJaaedRh555BGiaRrZsGEDmTdvHlm9ejVZsWIFufzyy8m5555LNmzYwO5ZX19P5s6dS+bOnUtCoRBRFIUsW7aMvPLKK2TVqlWMxzzxxBPE5/ORs88+m7zyyivkiy++OGSWy7fffmuxXJzClQcJkpTStDYUH2/hg94Ubre7w2vxGjLphKZhjwfwkyL5ILRd26P36ugePD1vv/02rrnmGiQSCYwcORInn3wylixZgpEjR7YrqEmzm4455hhUVFRg7ty5WLBgAWpqalBUVMSyyaj1BZiB9kQiwfrMXujTTmdHdB9IoJRqvDTbxTAMhMNhBINB6LrOMp3szyYUakVWVhYkyVyuWZIE5OZmp6XP3s90Rj//DPhEgM8//xyCIKBnz57tEje6G/Z2JhIJZGVlWWjoTL8eCIxkMolhGHjllVdwzjnnIBAIIDs7G83NzXjnnXdw0003We49cuRIuFwurF27Fm1tbfD5fDjnnHNw8803M0vZ5/PhzjvvxFVXXYX169cjEAhg4sSJWL9+PaZMmYK+fftmnMMTDoexYsUKeDweFBQUWMYBtUipZ0AQBCxevBinn346evfuja+++go9evTArFmzAJiJPg8++CAuuOAC/OhHP0KPHj1QXl6ODRs2oLS0FK2traivr8eUKVOwa9cu5Ofns3ldiUQC//73vzF//nxMnDgR27dvx7333otdu3bhxBNPRJ8+ffD111/jjjvuwMCBA7FmzRooioLq6mokEgksXrwYu3btwnPPPdelz+xA4AiX7wE6MIcOHWrZxr+k1Cy1Z5DxbpfW1la43W5LAUfK4GghQeoK42t08TRQ85jW1uKZF62vJcsym00PmNlAfr+/XdCPdyFNmDAB559/PoLBIB566CFs374dy5Yty9gfgiCgsrISo0ePxvDhw1FYWIjCwkL2wtDaXdQlKAgCsrOzIQgCo41uNwwDbW1tbL6K3+9HVlYWcwPyEzy9Xm/a4CXtnx07diA7O5tlb/n9fks2jSRJyMnJQTgcxt69e9GvXz+2nYfL7UJbWxuCwSBE0Uwpd7lo8oUBIOXG4NPIeVcbIYTVQaMMVhRF7Ny5E4QQDB06lDGzrmbomUDT4Sl9vBDM5FLsKixYsABfffUVbrrpJoiiiDvuuAMLFy7Em2++iWuvvdZSry0QCGDChAl47733WHmhrKws9OnTh/VVU1MTLrzwQmRnZ+Piiy/Gxo0b8c477+DSSy/Fs88+C7/fz9ppf4+ou6lnz57Iy8tj++LxOLxeL1paWpCbm8ueaUNDAwRBwOmnn47CQjNhhz7rG264AU8++SRKSkqY0nXFFVfglltuwW233cbmhbz55psYN24cCCF4//33UVlZidmzZ+OOO+7Ab3/7W0yaNAljxozBlClT8Ne//hUFBQWQJAk33ngjXn31VfzgBz+ALMvIzs7G1KlT8Ze//AVLly7F+PHju+2ZdQaOcPkeqKmpgSAIqKioAGCdF8D7qUOhEPLz85lgUVXVkg2Wm5vL0o09Hg9qamoQi8UwYMAAqKqKxsZGiKKInJwcFg+h16Lfq6qqsGnTJkyfPp2lJ1NrKRKJYOvWraioqLBUuF2/fj2OOeYY9pKKoshiAnSuRklJCZ577jnEYjGoqoqKigoMGzYsLcOhAo5WBr755pstgu6JJ57A/PnzMWDAANaOuro6RCIRXHvttSCEwO/3szLvV199Nb755hv4fD40NTXhmmuuwW9+8xsAYKWKEokEPv30U0ycOJHRQe9H+z8cNlO+o9GoJbtOEAS0tbXBMAzk5+fDMAx4vV7k5+czjdreRpdLgiz7sG9fPQoKC5BQ4oBgZqMZuoDm5hZomsbmt1BtctCgQQBMYVVfX4+PPvoIM2bMSGuxFhcXW9pxKLB3714oisLGhr26QneAKgNvvPEGfD4ftm/fjiuvvBKjR49GTk4OPv30U2zfvh3HHntsWm8AhSAIqKmpwbBhw1if79mzB1OmTMETTzyBWbNm4dZbb0V1dTWb1EzvTVNn+QrXgmCuN0StaH488RYlIQTBYBBAqlxTuj4rKyuzKJO8UFNVlSlN06ZNQ2VlJQBg5syZmDt3LtatW8emKSiKgmAwyGiktFArivci8PGzwwVHuBwkBEHABx98wEqo8yY+HWgulwtfffUVduzYgbPPPhuSJCEajWLr1q0YOnQo05zphDxahbe5uRk7duxAv379EAgE4PP5UFtbC0IIvvvuO/Tr1w+GYaC1tZUJrcLCQgwcOJANRL4eVE5ODkaMGAFJkpCbm8telN27d6O8vLxd8J62j36PRqMAzCDpT37yE4uWR8FbEaqqYsmSJQgGg4jFYkxTPOWUU7BmzRqIosiuuXHjRpSVlWHQoEHYunUrCDHTpD0eD0pLS1l14z179jCmq6oqc1cYhoHRo0dbBC3fBsooevXqZUkNp22mtcroi0hLp1NGwzMiwKyk6/V4kJVMIw8GgxAggCTX/6CTOKlg0jSNCUtKV05ODsaPH99ugTBekNgt1O4GFbI0KcFe0qc7QAjBRx99hE8//RQjRozA6tWroWkaPv/8cwwePBgrVqzAa6+9hgceeGC/16HjSRRFZglLkoSJEyeipKQEu3btwo4dO9C/f3/LBFx+eQO+vbt27UJTUxOKi4vZOkKyLCMvLw+EELS0tIAQggsuuACAdS6anTZqVQmCYKmzR70K5jIQcXYdCloUlULTNIvQtytRPJqbmw9bYgiFI1wOEjR7infvACmmRed2DBw4EMcddxx70H6/HwMHDrSUVgGsxQ2HDBmC3r17swWoJElCaWkp8yebbhQBubk5SSYooqSkGD16lCSZa2p+BU8PHeDUDXP22WezGe+Ufl6Lo39NF5CI+vp6rFmzBhdddFFGrXrjxo2oqqpCbW0tcnJyEIlEWOXi8ePHM1Odnjtt2jT4fD788Y9/ZH1xzz334Ntvv8Wjjz7KNMNoNGqpDkDp9fl87IWj1+SFD20TvTZlFLquQRQlVj15374GeL0+dj9ew+Tb6fP6IQiA1+uHKHArDkKEJKViSbSNPp8PY8aMsfj4fT6fpQS/YejsOqkxZF30rbuxc+dOKIqC8vLypNAzswlNGq00pIsHdSZGZBf8iqLgrrvuwogRI/DOO+/A6/Uypay+vh5jxozB3Llzcf/991u0cgo6vgkxs7QKCgrYO2YYZgXv66+/HqeccgreeustnHfeeVi+fDlyc3MZnfaF6oLBIM444wwsWbIEn332GQYNGtQu4zIUCuG9995DSUkJ+vbtyxg8b7lQOiVJQllZGcu+C4fD7HjDMODxeNjsf956oh4OOgbo8byVkk4o0t+nnnqqY7kcraAuFZ5Z86BmPA2KUhBC4PV6AYDNYLcHdmkJeLqWiN/vZ4Fneq7JHE0/PyHWemPmuE4xRfsLRO9DtXZ+ANrXIqHtA0wGn5ubi+eee66dW4xabHPmzMFdd92F/v37Q9M05OfnMyuKHk9dhps2bcKSJUtw2223WQLsDQ0NqKioYK4zQRAY0+dpS2dlGcmyMiNGjLDQRwWzyeAMSJLJwKnwBghkWQQhOmhl6HQvpiCYbZHSvLOmxaoyjZj2Gz820l1TFCUYhgZBIMjKCqCkpAiAWdkBGZZj7mooigLDMFBWVgZCDCQSalJQtp/wycPuOtwfQ6NMkiorNTU1+OCDD1jMjLpyCwoKMGzYMHz44YdMMNhjQHQc8W5gc50fGbFYDOeeey48Hg/mzJmDgoIC/PnPf8Zjjz2Ghx56iNHS0tKCJUuW4KyzzkIwGITb7cbs2bNxxhln4M9//jOmTp3KYi+AOXbvvPNOqKqKq6++Gn369GHVH6jwpBYpLXVErRzqbaAWcSKRYIoP70angkXTNIwaNcrS57Q4rZGsuEHvxacrC4JgoflwwZnn8j2watUqeL1eHH/88Qd8Lg2aUjM5nRVA3Wg0J55HNBpDU1MTe9F4rZA/n94r3f0PFKtWrco4y52+VIlEgmlfPIO1H2sYBh5//HEUFRXhyiuvRHNzM2KxGAgxqyHT9U94jTXdPdOZ/SUlJWm1Od5VtW/fPkYnABQWFiYto/bMlJ8vsT/QeT8HCloPzu/3WeJzhwq0v4qLi5mLNhP4+RO0XztDL2+d7969m1nAtbW17crMxONxRCIR6LqOW2+9FZ999hl7Drm5udi6dSuuuuoq3HTTTZg3bx5EUcSHH36I9evXo7W1FZdddhlWrVrFMrcef/xxEELw0ksvYfXq1Wws3HPPPbjmmmvw9ttvMyWxV69eeP3116EoCiZPnoyqqips3rwZ1dXVuOyyy/Dyyy/j9ttvx/3338/idH6/H7169cIXX3yBW265BTfddBNeeOEFCIKAu+++G9u2bQMhZhUNwLTOafklKkja2toQi8VQV1eHX//61/juu+/w8MMPs/egb9++2LdvHx566CG89tpruPnmm7F+/XosW7YM77zzjkXw3nvvvfj1r3+Nffv2HfSY+L5whMv3QFVVFXw+nyVbbH/gmSU/ASyTtldYWMgGH49AwG9hQule8HQvO70PZcoHYjYnEgkEg8GMwkqSJOzZs8fCmNJlPImiiLfffhsLFizAKaecgt69ezONlcZteEZEr59OkPDtoP1IkxHsoLQoisLK+fOlODIJQkpPuiQGO3hh33kQ5rMPBLLQu3fvQy5c6L3MNGuJuWT5fRT2ib4AWMxgf6Dj9NFHH4XL5cLAgQPx8MMPo6amxnLc22+/DVmWcdJJJ6Ffv354+OGHsWPHDhiGgVmzZuHyyy9HTU0NJEnCJZdcgnPPPRfXXHMNevXqhY8++gjNzc0YN24cCgoKAJjZgpWVlRgyZAh+//vfY8+ePZAkCQMHDsTgwYMxZswYS/sqKirwzjvvAAAqKiowfPhwDB06FFVVVXjsscdYYgl91tnZGrBv0AAAIABJREFU2Xj66acRCATw/vvvIxgM4q677sKoUaPwgx/8gFnel156KSorKxGPxzF58mRLcc/ly5fj0ksvxYQJE/Dyyy9j3rx5OPXUUxld1157LcaOHYsnn3wSf/rTn9CjRw+MHj0a+fn5mD9/PjRNw8iRI3HKKafg9ddfx5YtWw5K0ekqOIuFHQToi9+/f38AwLZt29q5aoD2mSE8qMaSbl4Kfwzvd7e6H1Kzhvn7msxQgc/nt9BAs7iys7PTph7TdOXm5ma2jK+dmT700EP47W9/i5EjR6YtviiKIjZu3IixY8di8eLFFpooHY2NjZg9ezaeeeYZjB49Gq+++ipL7aQ+6zPOOAMDBgzA888/z/qB799IJJLWTcbfKx2ogBJFEY2NDSwtub1gaR9j4J/l/uIK6ejqCISYSy+fffZUbN++HZs2bWRzf0zm0/0M4sUXX8SVV16Jp556CjNn3gAWS0oudsf3fzoLMh6PWypHpAM9N9N++3b+ufPxFf74TNfLFAOiY4CvPmAfTzwaGxuxfft2dp+BAwciOzu73XF0f11dHTRNQ2lpKURRZCnM/DH2Nq5evRrjx4/HnDlzMGbMGITDYWRnZ+O4445rd15TUxPLoMvJyUl7/VAohB07dmDo0KGHLGZHCMGmTZswbNgwrFq1ChUVFU7M5WDR2NgIRVEwadKkjMdEo1Houp524PL+5e8DXku2a8z2WEpOTk67l5++bFSxCAQCFncaf+wHH3wAl8uFE044wZKqyzOeqqoqlu/Pn0sF6cyZM/HWW2/h6quvxiOPPMIye6jlQ5dgpS8+tTRooJzGTuj3dO4vIFVEz+VyIR6Ps0AoDZbn5uZakhlSbQBbz5wenylwmul5HAwEQUB9fb3l96EOxvLtTCk17WnYtWsXS0igx/ETiTu6/oG0iWeM9ligneZMbUm33X7ddMKCgs7T2h/o/Xr06GHZzid4pBN0gGn1SZKEvLw8DBkypF3JG/68goICZo1lun52djabQ3O4IAiCI1wOFtu3b0drayuOPfZYpgkBVgbv9Xo7TAXc34tGtbVU0Hn/4OMI9u2doYNmuaXD/fffD5/Ph1GjRlnSdAVBYAz5xz/+MZvoyPvkqZvlgQcewOTJk3HxxRezffy6EJIk4Re/+AWOOeYYRndTUxN69erFrtdRGXy+TXwmUTweZ/XfCCHtsuQ66ivaFrurrisRj8exY8cOFBYWMvoOpXCh9zL7tmMG3qtXLxY4t57n4EARj8fx9ttvQ9d1LFq0CBMnTmSWyNEEPhmB8kBnRBwk9u7dy9ZhyTSTWhCEdoyeZ2j786n/61//wqRJkzo1U5vuNwWDaElD5h94pvums37sQmbChAkw3SUCy3ZxuVxwuWTIsgRAwIQJE5gVlLpOShOmqdkmTdaJp5TmCy+80GJR0HIovLDKVL6DBz+r22rRicytSOkiBKA81G5RZrJcMrleOgM73W+99RZCoRDKysoACMlMMYH1U3eDKiXl5eWWPjGfd/slCtIteZBpXGXa11FsShAAfldHVnm6e6a/ZufWhs90rf3F0jKNj47Q2NiIpqYmVFRUYNWqVWhra2PLbxxqy9WOzvAcSqMoiti+fbuFZke4HCRokDcSiQCwxkc68nOm81lncm2NHTvWcl77wW1dOyR1vfZzCuzX4UG1DurqyjSxTxDodwJRBDweV5IJGWx7PB6F250NM6XX3EYvIQiUgRtM4Nj7jr8/tWrS9RdPtyCYGWBUmPDC2C5UU0IrJfQJoe1sn+KczvLk6QZS9dAOhBnwtEciEbz22usgBJg162YA/ByTTl/yeyErKwuCIOCzzz7D5MmTYRip/hJFXghb04F5q44i3XPl/6brKzo2Us/KSp9hWI/P9I51xBDtil1nBAdPZ7oKzfa4j33c8e+nnWZCCHr16oWXX3452cbUWEv3Xh9u2GOf1vdJwL/+9S+rcno4iT2aUV5eDr/fj3nz5qGlpQXAwfvb6UOzD3h7rjo/+OyDmPfNUvdSpheJB38u7/bpTFvszEIQBMu8Hp458wyJB42t7M+yyrSdZ1x8O9LRn+nlSC98rAI/3Ye683j6Ovuhxzc0NGDGjBlYunQpy4LqjMbb1ZgyZQpOOukkPPnkk3jqqadYnwLtg+m0b2hMLFP/0GfCP19e8NjHhL3v7UKKd3Xur1/561Gkex/s++300L+8C7ijsWq/Ht9vmWjm28e7kY8E4WIXIgAsz5d+Pv/8c/z973/H8OHDk9a3ky12UKAv1plnnonly5fjnHPOwezZs5Gbm7vfQD0/sNMF7vgXkR9s9MHS+k+SZC1iyQfYDSOlhdN7Utg1okwaUnpNzromN1+gkfZJymUCGIaOaDTKCg+mT2FNYO/eWvTt2xfhcBj19fXw+/0IhULMzKYlaqqrq9HS0gKfz8eKbvbs2RONjY1obGyErutobW2F1+uFoigW5peTkwO/38/mDKUrXUPpTyfo01lC9md3IEKhra0Ny5YtQ01NDfbt24fzzjsPzz77LEs0ONSMhVac+H//7//h7rvvRmVlJS655BJMmjQJ69atQzweR3NzM8LhMFsOGQCLCWZisrIso7CwEPX19ZBlCVOmTIEgCGhoaMCAAQORl5cLwyBIJOJwuWQIgll9oqmpCUuXLsWePXtQWFiEaDQGRVGYhcozZTtKS0tRVFSEqqoqBAIBlJaWwu12o7a2lhXodLlckGWZTR7lwTNSn8+HkpISlJSUoKCgAHV1ddizZw+i0SgGDRqEIUOGoKWlBaFQCLpujnfqxm1qamLVIvLy8iAIZg00uoZNIBBANBpFr1698NVXXyE7OxunnXYaS7w5HEpGOtC+0HWdrWYLgGV3fvrpp7jooosgSRIWLVqEYcOGme+SI1wOHHRgt7a2YuzYsaiuroYoiujduzcmT57cLrMlHZOig6+urg4+nw99+vSBKJqFHJuamuB2u5GTkwNZlhGNRuH1erF9+3Z8/fXXcLvdOPPMSdA0DaFQG7Kzc5CdnZ38HUJtbR0URbHU0lIUBfF4nM3riMfjUFWVTVyksLvQ0oEO/JycIFwuN1paWtolH/B1jQyDJLUxidUKUxQVgoBkIcGUO5EQc/5POoGYSdtMp0UeaF0l+/U7ajulk2ag0ZeMZu4QQhgDpm3h28dbecXFxbjjjjtw+eWXW6zHQw3eSliyZAnWrl2L119/3bKkNj2O73+qTFG3Wn5+PitRpGkavF4vdu3aheHDhyMSieDjj1dg6NAhGDp0GL79dgNWrvwMiqIgPz8Pw4YNR0NDA1pamlFbW4f8/HwEAgEUFBTA4/EiFovB5XJh0KBB8Hq92Lt3L3RdR8+ePZGbmwuPx4OvvvoK1dXVOPbYY6GqKr755htWQZu2gyoftL18u+hfuvibpmlsaW4aY5QkCW1tbQiFQpa+48ecXSmk2/gxxiuE/HX2J1TSva+dFUT0eN5ypPFTWZYtSwzwz5jWPxs6dChOO+00eDweuFwubNu2De+99x7Gjx+PRx55hBXp1DTNES4HA8oAAWDLli1444038NJLL6GmpobNtObdJnyRRXo+X9lUURTGVGg9IZ/Pxyq4+v1+9qKFw2HEYjG43W54PG54PJ40ltLBa72CYBbXGz16NFauXGlh0JJkvgzbtm2DyyUjNzcX+/btQ3NzMwoLi0CIgcLCQrhcLjQ3N8Pt9mDatGn4z/9n78zDo6iyxv1W9Z7OHpJAEiDsi4CCIIosojAs6qjjBuMyog76uYuOCuOuM+rMp37jjMxvBEFlVBQ3XBAREUFAUUFA9rBvCWRPp9NbVf3+6NxKdWchiUDSUO/z9JNOd3XVrVtV59xz7rnnrF9PSUkJGzasp1+/fiQmJrJ161bKysqIi3MTH59AQkICmZmZbNq0iXPPPZfx48fXG8hQl9urPlfY0YgWKg3tP9wHYQUpQsxlWaayshK73U5aWhqyHM4sXVpaisVioaysDEkKJ4K02+36vREIBOjatSu9e/fW75XWQrRV0FDbjMLSeH+Lz4z/yzIUFBzioYemcd311zKg/wAefvgRFi1axKxZr7J48VesWrWKw4ePkJqaykcffainKJJla9S+IkPhhRegLgFeV3sFDd1HNYMjVY8ujN6mqfdcXQOkE4nx2gqZ4/P5KCsrw+12Ex8fr/eZ0bNy+PBhCgsLSUxMxG6343K5arntjecUDAZN5dJcRHp5YaIfOnSIXbt2RSx4FO4W4RYSF8voUxUlSsWFESNdp9Oph+/Gx8fryqWysrJ6BGfB5XJVKxlH1EMk0RwFI1xbRv+yUbAoShBVVbn33im89dZbDBo0kPT0dAYNGsTOnTuZMWMmI0eex86dOwmFFD744H1deFZVVXH//X9i7ty59OvXl+7du7N582aKioro2LETGzduJCkpibKyMr788ku6desWEeKtn1kjH8qjjeSa+3ALwSL6yKh8jQLHaG1FC9m6lFhLWCv1YZxjEO+bEgpvRFh1VqsVRQ2yZ89uzjtvJC6Xi1UrV2Cz25k6dSp/njaN5ctX8NBDUwkEAsyd+zZDhgyp7kcZWa7xBhjbVpegj1YC0da48ff1Ba9EX6ujWfRNuZ8aujdbwh0afczo+9boLoa6FWR0PweDQTNarDmImzo6a3Hbtm31Byn6Bo82ZeszbY3vjQ+10VwPH19Fko4eHtlUoiO1jIQfcrjqqiuZNetV+vfvz6JFi8jJac+tt97KL7/8wjfffMOoUaOZPv1lPX27sIb++te/8Msvv/Djjz8RF+dm2LBhbNq0ib/85RkefvhhFi5cyH/+8x+6deum90v0Q92Uc63vQW3qfqL3GS3cjH0WLYyM17OuFebR0XmtCXE+TbGqou9H4/2rqirtc3K4/vprmT//Y+Lj41m/YQMVFRX87/PP8/Zb75CUlMTMmTM499xz6yyyFm1pRh/PqDxEe6LbJ76rK1NFfefR2PNtDC1ltdTF0RSLwBjJWd820ZjKpZmIh0YsHqvvATSOTOub26jPxDbus/Yowfhds06hzrYa3Q7CshKCMRQKsHHTRt55520sVhlXnJPOXTox89UZzHtvHqUlZTz77N+YPHlyhBUc3qdMYmIy//73/+PCCy9k48ZNJCUl89NPaxk/fizdu3cnNTWZyy+/DBBme00I6rGMoPk1+zAqk+gAhYaEsHG+xUhrcocZaUjwRhM5P1ZTPsB4LwWDATQNPB4vPXv04W9bXmDp0uVUVHgoKS5nzU/rqKjw8N577zN48GAkyVK9dqr+NtTVJqMyrGtwItpTn3uqIbdVfX3QlMHB0dxyx5uGZFB95y5c+MZlAY05Z1O5NIPG3BBNuTmbe4xjTfSEolAuPp+Pv//972zdupn3P3hfLwHw+eefM2LEcLZu3cqRw0U8+eST3HDDDRFh0EYURaFHjx4sXLiQcePGsX79en73u98hSRoff/wxJSWlTJz4e0aMGM61115Lenp6xBocUfq5JWmMgGvsb1srTW1n9PZ1hXyvXr2aZ555lsWLv9Ln1+66624+/fRT3G43hYWFfPTRR/rarqYENjS2vXUN6H7tNk2lpe+Bhu7f5sq1erc151xMBMZABU3T+P7773n//fdZu3Yty5cvx263cs6QIdx55+1s3bqVxx9/ktTUZDp0yOWF51/g7LPPAYjIVQbUClWVZZkVK1bwm9/8hr59+6AoITp06EhSUiJz5vwXSYIuXbowZsxYpky5j3bt2ulWS2t1IZmECdelkfTIxdmzX+Obb5aycuUqKio8XH755dx///0kJSVxxhln4Ha7kSSJOXPmcN5550VE1rW0IDZpPsFgEL4uKte+zC/SAoGAZnLyo6qq/gqFQpqqqpqiKPpnhYWF2tSpU7UzzjhDc7vdmizLWlZWlnb11VdrK1Ys13w+r6YoQW3fvj1aTk62dsYZp2v5+Qc1RQlpiqJoiqJooVCo1jGDwaD+naIomt/v15566inNbrdrVqtF27t3j+bzebXPP/9MGzPmN5rDYdckCa1Xr17aO++8o3k8Hr2dxvYaXybHn7r6PfKeCmo7d+Zpb7zxuva7312mSZKkxcW5tEGDztReeeU/WmVlpRYKhbRQKKSlpKRoubm52rfffqspiqIFAgH9/jCvZ2wTCAQ0U7mcYghBL17iYV6xYoX23HPPaSNGjNCsVquWm5urXX755drChQu1/Px8ze/3a6qqaJoWfqmqov3+97/XCgrytWAwoCmK0qQ2BAIBzefzadddd52WldVOy88/qAWDfi0UCmgeT7n2xRefa2edNUiTZVmz2+1aly5dtA8++EALhUKa3+/XgsGgLtCE4jI5/ohBiaIoer+LVyAQ0L766kutY8cOmtVq0SwWWbv66qu0zZs3amVlJZqiRA46Jk6cqC1ZskTfn8nJQyAQ0Ey32CmICH3evXs3M2fOJBgMMmPGDPx+P71792bixIn84Q9/ID09XV+ABkTMpRhXvzd1sl345BVFYe/evVRWVtCnTx/9WOJ7r9fLBx98xKJFi5g/fz5+v5/TTz+d0aNHM23aNOLi4iJ8+y09H3MqoGm1062Ulpby/PPPs3nzZj799BOys7O58847GD16tL5aO7yw1oLImQa1w/nN63fyYK5zOQUpKSkhLy+PmTNnsmTJEnbt2kX79u3JysrioYce4sILL6xVpEnMdUTHuhtXn9c3iV8XYpI+vKYmHF0k/OxinU2NsgoLo3nz5jFr1iw2btzIoUOHGDRoELfddhv9+/fntNNOqzXPY3J8EEolFAqxdetW8vLyeOqpp1i/fj3du3dn8OCzuPPOO+jTp0/E/Fg42igynb+x0uXREr6axBamcjlJEA98dDJAzRD9tWnTJrZv385LL73Et99+iyzLnHbaaVx44YXceuut+hqd6JBZ43uoezGZ2KYpE7CRi7eMUWrhdPOqGk41r2mRodobNmzg7rvvZuXKlYRCIRISEvjnP//JxIkTo1ZmS9VrgUSUmTGstXmLTE8VjNc1em0DwL59+3jppZd49dVX8Xg8pKSkcOedd3LXXXdVZy0Q/atF/A1fxvoXI5oT+CcPpnI5SVBVVV9wZvzMYrHwzDPPsGzZMn766Sc9B9iwYcN47rnn6N69OwkJCfpD3RTroyVQq6tLKorC7t27efzxx3nvvfdISEggKyuLiy++mIceeqi6smDtdO+R52aOkutDKBVxDwkLY+fOndx7772sX7+e/Px82rdvz5/+9CfGjRtHTk6OvhaiNd9DJicGU7mcJBiFgaZplJWVMX/+fN58801WrlyJJIUTCv7xj39k/Pjx9OvXT7/WxvUjTUnz0RII5WLMffTaa6+xdetWpk+fTigUYtiwYYwcOZILLjifs88eHJEfy1QujUPcSxBO31JQUMCLL77IW2+9RXl5OZ06dWLChAlcc801dOrUSZ8/M0OITQSmcmnlRLunGuLQoUNs2bKF2bNn8+abb2KxWEhOTmbEiBFMnjyZwYMHExcXpwtm4UozJtXUtLpLJLcWjMWnRFCC6J9ffvmFKVOmsGnTpuoEewk88cQTXHPN70lISIiaLK7tFjvVBOLR7qeSkhKKioq44YYbWLVqFRkZGaSlpTFt2jQmTJig3zMQVtxC6ZvKxQRM5dLqqavOhNEHrqoqq1evprKykoceeoh169ahaRpDhgzhqquuYty4ceTm5p4SrgqtOunmrl27+Otf/8qcOW8gSRJ9+pzG+edfwF133UV2dhZAdcRSTX+cigJR9Je4j4z5opYsWcLUqVPZuHEjoVCIoUOH8sorr9CpUycAU06YHBVTubRyokeXRmHw888/869//Yu5c+eiqipJSUlccsklXHPNNQwbNgyLxaKP9FtLVbvjiVC84u+KFd8yc+YMPvpoPj6fn5ycHM4552zuu28K/fsPIJyEMzIZ36lEtCvV4/Hw0Ucf8corr7Bjxw5sNht/+MMfOPPMMxk5ciRJSUl6f5khwyZHw1QurRzhuhIKRVEUZsyYwYsvvkhxcTGlpaV069aNuXPnkp6eTkZGhl6oS6xDEVbLyS48xUi8JpNvuGbKjh07mD37NV555RV8viri4xO49957uf32O/RghlMxDFb0V3FxMe+//z7//ve/2bx5MwBDhgzhH//4B3369AFq5uUA/f4yMWkIU7m0Aoz1syEyO6mqqpSUlLBw4ULmzJnD8uXLCQaDpKamcv311zN06FAuvPDCCOFYV/U749/Wh4YIRa6bhgRZzW/DGZRr3DuqGiIUClQXa7NRVlbO7y77HT/9tIYqnw+r1cadd97JffdNIT4+nri4OD0U2rjG59hZNUc7z/pofti0sEzqSpPu9Xr55z9fYvr06Rw4cBC3O45bb72VRx99BKfTVb0mpbrlUXN/pnIxORqmcmlhhGtCIN77/X527tzJ0qVLeeqppyguLsZqtdK3b1/uuusuRowYodeVj31+jXKp6bvaLkQ/Xq+HstJy0jMysFqsBIIhdu/axZtvzeWFF17E7/cjSTIDBvRnxoxX6NOnT7WVSIQ78dgol8aXXK5N866zMYsChCO/9u/fz+zZs1m+fDkrVnxLu3btuP322xg/fjy9evUyWHKm68uk+ZjKpYURrgljypOVK1fy17/+laVLlxIIBMjMzGTUqFFccsklXHTRRciyrPu8W6810hSOvXIJC1QVRQmhhBQsVisSUvWCTBlFVfn6669ZuvQb3nlnLnv37ic9vQ0vvvgC3bp1o1+/MyJcisdGidevXOqK3DoWYdOiCqSmaaxYsYKVK1fyj3/8gyNHjtCvXz8GDjyTP/3pfnJzc/XzDa8LIsJyMTFpKqZyaWGEcjlw4ABPP/00q1evZv/+/ZSXl3P66aczcuRIJk+eTOfOnYEaN82xLJx1YmiuS6gJRzCsKg8EAthsFnxVXhRFwRXnBk1Dqs5tJQGh6uCIrVu3MnXqND77bAGSBAkJiTzzzDNMnjxZ79+WVy4NUb/bTFUV9u7dw3333c/ChZ/j8wVo2zaTadOmMmHCRBIS4vX1TWJeL5zny1QuJr8OU7kcB4wJ/aDG1WX0eYtt5syZwzPPPENRUREVFRV07tyZK6+8kgkTJpCbm4vb7W7wWM1RLkKhGavKNVQW1tj2+s7TOK8TnXYm/FdF02qKfonvolPMiMV4xtK4Yr/G0sLG39XXdk0TFRFFv1t060XTNFStpoSuz+fD4/GwZMkSbrvtNjRNwm63M3DgQB577DH69+9fq9z00fq/9vkBaBH3g3EFfENzO0L4G9eS1KRWiZxPCQTC80w//vgjX3+9hDfffJODBw9y8cUXc8MNf+D0008nKSmplqUnCE/cS9VJJmunahHtNs7t2Wy2WveAyamNqVyOA8Z5FGFliAczGAyybds23n77bdasWcOSJUtwuVxMmTKFzMxM/vCHP+BwOHSBeTzWpxjbZxTq+fn51XMQtUufGidxjQqpsLCQtLQ0Pe2H+I1R8IRCIWSLRF7eVuLj4ykuLsbvD+Dz+fD7fXi9VXgrq3RLzG634/f7dUFaXlFKUlIyiQkJSHLYReXz+amqqsLpcJGWlobf78fj8SDLFrKy2lFQUEBBQT5FhYXhc0BCU8Nlk/Vzq849pqoaVqtFz2XWrl07Pv10ARUVFezZswe73c51111HMBjEZrPhcDioqKjQr299Qjr6ugkFI7apqKigvLyc9PQ2OBxOfRvjNVHVcNZgq00mFFLw+fx6FdDw9iqyZNPdXyKqq7i4mHfeeQfZEs7n1alTR4YPH47D7qSktARNg6LCIqqqfFRUVGCxyDgcTsrKyjh06BCappGSkorT6cTv92OxWDh06BAulwun04mqqtXWoY3CwkJeeOEFrrnmGlwuV4SiMTl1MZXLccIovIUQXrBgAR9++CGrV6+muLiY3Nxcxo4dy9VXX80555xjcEnUjPqPh+tLtE1VVYLBID/++CNvv/02H3zwAUeOHKm1cFNQl/VitVprWWnRyiX8Y5CksHCvEcjVVoWq6RuJn4R3Wf09GrIMqkrE95IEsmR0V0nVFlJYOMuSSJgImlbt3pJk1Opja2gRGQlEu8N9LuN0OgkEAgQCAV25inBcY1RadB+Jz+12u5412rit1Rq+xqLiZ82xNWRZ0uc9wv0nYbVacMU5sNnsxMXF6UpX0zRKS0sJBRX8/gBWqxW73U67du2w2WxUVFSQmZlOMBTUBw0ul4vi4hJkOTz35PcFqpWmFZvNhtMZVh6hUAibzR5xPkaLxKgEN2zYgNfrZcSIEcyZM4esrKyTJNDE5NcQDAYxHavNINpFYHTbGLdZtmwZ8+bNY9GiRezevZv4+HhGjBjBueeeyzXXXEPbtm31/QjFIh7m45WGxWiNPPfcc7zwwvNUVlbSpk0bLr74QiSp8cd1OBy43W5d4FmtVpxOJ3a7naqqKjIzM2nTpg1xcS5CShBfVRWeykpdkca5XJSXlxMIhCguLiYQCFBVVUVcnIu4uDgcDieSLKEoIWxWG5ltM0lLa0O7tpnY7Q6Eywtqu6GCgQCFRUdo1y4LWbbgq/JRUlJKYmIC7vh4QENRQuzcuQun00lGRgZ2ux3j/EV0SHKkZUL1sai2SCL71uFwoCiKIRdapAUYHYIORCmXsIKxWq04nDbsNjsOpxO0miScRUVF+P0h/H4/drsdu91OTk4OFosFj8dDZmY6iqrg81WhKioul4vS0lI0wko+FFTCQsBqxW634XLF4XA4CAaDOBzOWtmQjf0rXHkLFizgjTfeYOnSpdx00028/fbbpKSk6L8xFc2pi2m5NAPj+gHxEIVCIT2Ka/r06SxdupQvvviCqqoqOnXqxOWXX86NN95I165dWzR/l6qGran33pvHDTfcQEZGOv/7/N8466yzyMnJxmpxtljbYoOGQopPvVT+mqYRDAZ59NFHef755/nnP//JTTfdpD8b5mr+UxPTLdZMxOhUjOAANm/ezIdmaqmtAAAgAElEQVQffsgXX3zBjz/+iMvlYuTIkUyZMoWzzjoLq9WqjwRbcjQXdskotG2bicvlZNGiL+jWvRsSGpIsYZEdLda22MBULkbEQGvHjh2cccYZ/Pa3v2XOnDn6AKo1J0I1OX6YbrFfgaqq+P1+Hn74YTZv3sxXX32FpmlkZWUxZcoUJk6cSN++fXWXWbRroSVZu/YnKis93H33XfTo0QMIu2RCoRAW04th0kRUVaVLly6MHj0aQHfxmi6xUxtTuTQTi8XCypUrefnll8nJyeGiiy5iwoQJnHPOOXrhJOO2cPQ05ycCTdP45JOPCQQCtG+fEyEArFZ7C7as6YgV6NHhzca/gUCAsrIy0tPT6w2XNU5QR0/AL1++nP3793P11VdXR/+F+Pvf/87ZZ5/NiBEjolokR0SERc/BhUKhiJG8OE4sC2ExL2RMaBnL52Ny7DDvgmaiaRrbtm0jGAxy3333MW/ePK644gqys7Mj6s0bX60i+66k4fdXVQu26o8kWX/FIsY1N0YrUdM0Zs2axdChQ3VF1NA+xF/jtp999hn/+te/9DkEn8/Hv//9b5YtW6b/1nhNjRFiRsQ+jdF6Ytv6IvRiiaqqKvLz81u6GSatCNNyaSbGBXzx8fH6YrjWXs0RTWP3nj3IFhm3O86wwK/l3XXN4d133+WBBx4AasKsXS4XCxcuxG638+KLL9K3b1/9mogoJ+M1Egqpb9++lJaWIssyKSkpjB49mh9//JHdu3dz7733UlBQQOfOnTh8+AjLl3/LddddR2lpKdu2bcfn83HPPfdy11136feG8RiyLPPtt98ydepU9u7diyzLuFwu3n77bU4//fSYHu2L6EaHw5yvM6nBVC7NxLieoWPHjkCMuAMkicLCIzidDrr36E7sKJWa7McCSZI4ePAgPp+PqVOnIkkSc+fOBSApKYnx48dTXl7OmjVr6NChA+Xl5YRCId577z3Gjx8fsR+Am2++WVc04lVaWsoFF1xAdnY2HTq0JxDwo2kakybdgNvt5u677+EPf7iexMRExo4dE7FPo6V08OBBLr30Ui644AKuvPJKVq9erbfjm2++oWfPnsez844bwkrzeDzs27ePtm0zW7pJJq0EU7n8CjRNIy4ujtNOOy3C9dWakZDZvWs/NquDXj1PI7oqY2tGpJFR1BAW2YKqhjMgxMXFcc8997B69Woef/xxlixZwqOPPorNZmPz5s0kJSXh9/u54IILOP/88xk1alStTAWyLHPnnXfqaVqEYigoyOfMMwdw5ZVXAmG3V15eHtOnT+eNN95g2LBhrF79Ax9/PB+r1YYs18yvGddAPf744wwaNIh3331XT3NTUVHBwoUL2b17d8wqF3F+lZWVFBQUkJiYiKaJuTBTvJzKtG5J2MrZs2cPsiyTlpbW0k1pNKFQSHfZxGroecAfAMKLFysrK5EkCa/XywsvvECnTp148MEHeeWVV/D7/fz3v/9lwYIF3Hnnnfz0008kJCQwa9YsXnvtNX1/YmCwbNkyHnvsMQ4cOMDVV0/gySefZPHiL3n++ecZP348Y8aMZeLE35OQkMAPP/zAE088idvtZtmyZXz99de15llEgTeA3r17M3v27Ii8XL169QLQt4lVZFkmFArh9XpJTU3RP2sNASwmLYc5tPgV/PTTT3VO3rZmdu/eTUVFhV6FMRYJ5xfzYXfEsW3bNmRZ5v3332fz5s3MmzePGTNm0KVLF1RVZcOGDWzYsAGLxcKkSZPIz8/nxRdf1LMeG0PFFy9ezOLFixk69Fw+/PBDNE1j0KCzqo9a45YrLCzEZrOTk5NN27ZtmTz5j9Uj9pqV+wLhHrv77rsjklYK4uLiSE9PPxHddtwwBlSkpqYaou7MseupjKlcmokkSezduzfmBPTevXvxer1cccUVMacYIVxIbd/+faSlpWGzOdm7dy+hUIiFCxfSsWNHunbtyv/+7//y+eef6y4xn89HZWWlHnBx+umnR+TLMvbB4MGDq6O44MUXX+Bvf/sb6enp1WHIYSHqdsfx2Wef8dvf/hZFUQgGQwwaNKhWXxpXpwvXmziuoiisWrWKgQMH0r9//xPWf8cDVVXZuXMnEC5ZIIImTE5tTOXSTMRILScnJ6aEdDiXV4AOHTrEZHr0goICysvLaZvZFlmWKS0txe12M3r0aG6//XamT5/OHXfcwZdffsnLL7+MxWLB7XaTkJCgZ0nYt28fZ511lr5PSZIIBoMkJycza9Ys3n33HVJTk3n99dd59dVZTJ48mU8//ZT+/ftz/vnnEwwGadcuC5CYPn06P/+8jv/5n1txuayI+au6siIb53j++c9/kpeXx8KFC2PuGhgRSnPHjh1omkbHjh2xWCzVrr+Wbp1JS2Iql2YgSRKFhYVUVVUxZsyYmBIOYr1FLIaNigwIKanJBAIB3G70pJsTJkzg0KFDPPXUU0yaNIl7772X8847D5fLRUZGBl27dsXpdCJJEv3796+Vzdlms3H33XczYcIEfvrpRx544E/4/QGSk5O59tpr+Pbbb7nkkt/SqVMnBg8ezNdff40sS2zcuIkbb5yE0+mkocAIY4aG5cuX8+STT/K3v/2Nfv36xdT9E41wKyYkJACQkpJcZzJRk1MPU7k0k/Xr11NaWkr79u1builNRtO0mApCEEiShNVmxS27KfAUIEkSfr+fdu3a4XA4GDNmDC+88AIrVqxg7dq1fPLJJxEhwWKUvWvXrgihJ0kS27dv5+eff0aSJObP/4iuXbsRF+eisLCQsWPHUVZWxqRJNxIXF8eePbsB2Lp1KwcOHGDixInV+2647aIuypQpU5gyZQo333yznpU41hFuMdGvYbeYqVhOZWL/rm4BNE2juLiYYDAYE75lEY0kSRIlJSUAtGnTBoit0aWmSUhSdV17SRSl0ujQoT2SpDFgQH8yMzP44Yfv+d3lv+Pii8fh9/u5+eZbeOeduTgcLjweD2+++V9umHQdiuJHAyyyzPa8LVx73TX07t2LgwfyGTt2LDabnY4dc/nqq6/0+ZoLLhhZ7d7SeOCBB7niisvJyMioo63RlTo1ioqKuPLKK7j00t/ypz/dB6hYrXLMu48kSaKgoKD6XrI0qWyDycmLqVyaiRA24RogrR+hQJYvX44sy/Ts2TNmlEqYcDEx4dZLTEzSQ6pzc3MpLy9n/fr1lJWVcfbZZ9MptyPbt2+nvLyciooKpk6dyrvvvsf27dtp2zaTdm3bhudaAgEUWeKC88/Hbrdzxx13UFFeicvloqKigsLCQv7zn//oiqKy0ls9YW2hsLCQW265Ra84Kgp+6S021IMpKSnmyiuvYPz4cdxxxx1UVlZSXl7O7t27Wb9+A3/84+QW6dVfS3RONmgdyVlNWp7WP+xupaxevRqAvn37tnBLjo4xsePBgwfRNI3s7OyYsloEophWWKmHrYNDhw4xatRoLr/8Cp599hkef/xx3nvvfR5/4km++/57HnnkEb7/Pny9jhw5wtRpf+bW//kfJFlCkiXQYN36dWiaRkpyMvPnz+fss88Gwv108OBBXnrpJVJTU5k4cSIJCQl4PB7S0tLIzMw0FP6KbGsoFCIYDPL9998zevRvWLFiJW+88QbnnjuUrl27kZ2dw9Chw/SyybHIyZB80+T4YFouzUCSJNasWYMsy/Tu3bvWYrHWKrDFYsNYFQZCGcqyrGco1jSNnj17cNlll5GUlMTy5cvZsWMnQ4cO5a233mLUqFH0P2MAHTt2xOPxEBcXx5NPPMHDjzxcbUmMR5ZkNmzYQHy8m9zcjixfvgxNU5AkuPLKy5k4cSJr1vzI1VdfSVZWFn/+85/54YfV+Hw+8vLySE5OZs2aNQwZMjSivaIMdEFBAW3btiUzMx2Hw4Hd7qBv3z5omkZycjLXX39dC/Xor8dYfTMxMRG3293STTJpJZjKpZn4/X4A0tPT9ZXYNputVSoWY8336HrosUS0QpSksJIZNGgQ/fr1Iy8vj6effpqnnnoKJPjhxx/RtLDrbPjw4TzwwINs3ryZd955m2efe4YVK1Zy0UUXgQYzZ87i8ssvZ8eOnWRnZ5Galsqh/EO88fobvPnmm+zZs4cxY8aSkpLMli3bmDFjJkuXLuWqq67m0Ucf4fnnn2flylVkZGRWt63GRXTZZZdx2WWXnPD+OtF07dqVTp06tXQzTFoJpnL5FcTFxSFJkp46HVrnBLksyyiKwp49e9i7d6/e7mhfeayxdu0aKisr6du3L5qm8ac/PUDv3r25/vrrsFhkBg8ezKRJNzKg/5msW7ee/fsPMHToUOLj45k9exapKSn4/X5dAZSUFHPTzX9k1KiR5ORkceGF40lv04b2HdoT8Pt5/Y05fLfqex588EEuvfQSunfvxttvv80999zLgAEDSE1NbekuOeEYAxfcbjcul6uFW2TSWjCVSzNQFAVJkkhOTtbrcohw0tYoqEVK9Pz8fPLz8+nVq1erbGdT2bNnj54fLZwC5j3DqnuYNOkGVq5ciSxZuOCC88nN7cyll15KSFEYN26sXrslFApx35R7ee+998jJyeKOO+5AUzXOPHMA5w4ZgtUWvrYDzhzA0q+Xc/vtt1W743ryxRdfsGLFt4wZMwaL5dR7nIRiEZa8iYlA+rqoXAsFg4xITYjZRIYnmn379jFs2DB69OjBJ598gsViiXA1tTbBLVaHf/fdd4wYMYLRo0czf/58rFZrlItMQ+TQajonvn68pqls3bqF7t27h1tgsMQiV4iL/2XC5ychztXrrSQUCuFwOrDbw8pBUYJUeisJ+IMkJ6ciYcFitSFV/86YlNEYEVZTdC2yymX1O2ryk9XlmpRr/UbUCzoaYj/R1rNwh0av9anPaq05J/E+3FfR9X40LTJKrKCggIEDB9KtWzeWLl3a6u5/kxNPMBg0LZfmcOjQIfLz8xk/fjw2m63VT5ALQZCcnExycjJFRUUx7xILo9GjR4/wuyhhH60ARLiwuFbhtRgqbnc8qqqgoeH3+bBYJRQlQLzbjZxgA01CkqxIkoymgaoquuAWObREWhlNkyLcREahXiOwa5e7Dv8bWY0yeo6sZtu6yzHXvd+adhgTdCqKogcb1KV4wtuEDEqICIWkaUaFKvH0009TWlrKTTfdFOP3k8mxpPVKxFZMMBhs9a4wI0Jo9OjRgy5durBv3z7279/f0s06BkgRmYbrS/EuhLSoQBkeeVcHORAW7rIs43TFYbc5cTrdWCw2LLIFSZYJ15GJOrIkYbPZ9Dxaxs/rC54w/o3MEFDzmfG3YsASXbrZeE7RmQbq2kdNqHRNpJ2x7LKxDIARo+UjjineK4rC3r17eeCBB5gxYwZjxozhqquuqvcamJx6mJZLPUSPhOtyg8TFxTXaddGSGIXa5ZdfzrRp0xg3bhyzZs3SSwCLbcIrxmsL6prwX5VgMKgLrBrBJevukroJLzCsGUGL9PRhd1rzhFKN0PX7/brwCwQC2Gw2rFYriqJQWVmpn//333/PsGHD2LlzJ1arleTkZNq1a8fu3btZsWIFQ849m8TEeJYv/xa3O56MjAw2bdyCoqikpKSSn3+Q5ORkQqEQFRUV2O12HA4nPl8VpaVlKEo4Os1qtRIMBsOtrF7RH25DdW9EVdQ0up08Hg+JiYlUVlZit9t192UgEMDr9eJ0OrFarVRVVen50gQialEohiNHjuhW3IYNG6ioqKCoqIjs7GwyMzORJInExEQAAoEA7du3p7LSw7ZtWznjjP4EgwHy8vKoqPAQDAZRlBAejxcIu4erqqpIS0vjySefNN3qJhGYyqUJiNGgEKgDBw5s9YoFakJ4LRYL119/PfPnz9eFbHx8POnp6VgsFux2G1lZWTgcDkKhIIoSFoqqGl7DkJqaSlWVly1btlJYWIjP56OioqI6iaQbj6cSVVX0aozGxYWSBPHxCUiyRJW3qjp1joTVakNRwkERjaUhK6X+36ArNFmWCBsbYh9RK8zlmlkZNA2DYRKxn7rnVqSIAUj078T7Gusi0tqpvb/mE7bStIh2CKItV0mSdPeeJEk4nQ7WrVuvF5ezWq3Y7XaKioqwWMJKuWPHjlx77bXcc889J0V+NJNji3lH1ENdLgIIC2qv14skSRF1QWKFjIwMli1bxssvv8zHH3/MgQMHyMvL00faGzduRJZlHA6H/kpOTiYxMYEDBw7g9Xo5fPgwbreb+Hg3mqbh81WhKAqZmRk4nU49AstqtWKxWLBYZBRVweFw4HQ6cTicYcvCEk5uqKp1p6iHyEl6gRiZh0IhjD+re66jZgOHw4Hb7cbpdGC12khMTKC4uITi4pLq/YXnUVwuO4oSYvnyb3nooQexWq0cOXJEL1eQlJREfHw8VqsVq9VGenobJEmuXqTpJjs7W7eaRKRe+K9EIBCksPAIKSmp1VYHVFRUommanln4WN1PwmJpjKKSJAm73V5tdVlITEwgLi4Or9dLIBDA4XCQkJDAjh07UFXo1q2bXrbBxKQuTOVSD/WNIjVNY8WKFWiaFjEpGiuICd3bbruN2267jcLCQvbs2aMLQEkKj3RdLhcWiwWn01mtSOKRJAmfz0dxcbHujqmqqsLv9+tp1+12uz7ZLdxtFouMqipYbVacDqc+CpYtMhIyYKnVxobaX5POpsbd1JjzNloU4RxgUnUEmfBVVU/UqyE++OADvv12JX/+85/1vok8ds1xayKzZET1xejvRVvFPoztEZPkIlfasV7k2hjlYowwC7e5RjkbLZ8OHTogy1bdHSz2bZY1NonGVC6NQMwxiHmHLVu2RAmq1u8aEwi3hxBymZmZEWV2FSWE1SqEfc1cjVBKTqeLlJTUWmGuDQlDTdNA0qpDeY++0LSx30XPVTSEcZcWi4yGaI/4QkSZhT8rKiokGAgwa9Zsbr7ZGAVlnJyvCWuWZUsd8yjG/8Nh0OLjmnkw9Pmq43EfRSu5o1HTBs3wmUXfj6Xa2oyushlLAyyTE4OpXOrBuE7AOEGqKIo+qSrCUGOJ6FFxdFSSLEemTDcKQVU11kWX9Fd0NFTtYzb8f/Np/o7q/GX1OebtyOOvf/kLGRnpLP36a26cdEO4j6TI863186M2pyGl2ciGN5HGCv3a20Urx6P/1lQwJkZiZ8jdAhgfGpGN99ChQyxbtoy+ffuSmpp60ozaRJiqxVJbsQiMilRYQPVtG6tIksRXX31FZaWHfv36snjxYg4dOtTSzTIxiTlM5VIPR/P75+TkEBcXd9L4mes6j/oW5Z3MVFVV8dabbzFgwAC6d+9OeXk5S7/5JjyIaOnGmZjEEKZyOQrRi9KCwSBer1e3ZJoTFtuaqL2gr2mTycd68rklUBRFL/726aefsmnTJuLj40lISCAjI4MPP/wQseDSxMSkcZjKpR7qE5oHDhxAVVU6dOgQ00olmsYoGeMK8JNBqQhEpFMoFGLhws/p2LEDFouF0tJSHA4727Zuo7y8HK2O9SImJiZ1YyqXRiIE6S+//IIkSQwaNEj//GQRsqcqIqihqKiIpUuXkpOTw86dO1mzZg2dOnVi+/btrFu37vjNupuYnITEVqhTK2DXrl0AtG/fvslhniatm//+979UVnq54IJRbN68GVVVuPSyy/j++9UcOHDQvMYmJk3AVC5NQJLCZYLF+1ha32LSMHl5ebz77ruEQiHefOttAoEAFRUVfL10GVU+P6+9/ga/u/wKHA7L0XdmYmJiKpfm4HQ6cblcetEwU8nEPocOHSI3N5ezzz6bgoICPvroIy699FL69evH4cOH6dmzp5mY0cSkCZjKpRkkJCTgdDr1tCAmsY2qqpx77rkMGTIESZLYuXMny5Yto3379kybNk3PTmBeaxOTxmMql0YiQpGLioro0KEDHTt2BOpOrGgSW4gccVCzlqem9oumZww2gzdMTBqPqVwaiSRJBINBtm/fXp1Z12kqlpMIYzaG/Px8SkpKcDgctTIRmJiYNA5zsqAJBINB8vLyTPfISYyof6IoCklJSea1NjFpJqbl0kjEWgiPx0Pbtm1bujnHicYI0pN/FC/K/nbt2tW0WkxMmompXBqJ0QU2fPjwkzgTbEMK5mQ717rZsGEDEC6IZWJi0jxMt1gTOHToEKqqkpOT09JNMTmO7NmzB0mSSE5ONt1iJibNxLRcmsDixYsjUtKffDS++NbJzMGDB/XyxC2P6ao0iU1M5dJINE2jsLBQL28cy4jCZ2Ieyfh/Tend8LbGyol1lfYV76O3EfsyhvYeq7Ybjxl9XNGuusru1pfBWrRVfF9RUaHPuzTmN41tt6Io+r0THWXYcCVPNer/mutmrBJp3G90+4z9VlfbRSBDXZ/X1TZjf7d217CZpqlliG0peQLRNI3vvvuOuLi4mJ7QF+t1hCAJhULIsoyiKEC4zK9RsWiasTRxzX7EosIa5VRbmBsFWl1KoTkoioLFYqlub2Qd+prPwxUlo8sOGzMqiD6wWCwRSkS8T0tLw2Kx6P0TXda6OdkZxLoZcRzx26OVbdA0peY9GhbZgqKGkJBQFDVCKRgrqBqPI5REKBTSz1kc36iQovumIcUqrmlrHmyZbs2Wo/XeFa0MWZb57rvvaNOmDX369Gnp5jQbIdyMAk0I7FAoqCuQ8HeGUakk6YomLFTDSkhVlWqhBkb3TLQ1cCxGjKLtQkBqmho1alcRbiRFUbFYrBHnahTuoVAIm82mK4noEX16ejp2uz1CWEdbREYBfTRUVcXj8RAXFxdRC0jUkrHb7fWdNVU+L7IkY7fb0TQNXyBAMBgkLi4Ovz+Aqqo4HA793BRFweVy6XsIhUIUFhbq5xwKhQgGg/j9fqCm5IBxManL5cLr9UYob4EkScTHx5OamhoTKXFCoRCimqzJicNULo1EPLTx8fE4nc6Wbs6vQtM0/H4/GzdupGfPnlRUVFTnz+rBuvVr6dqlC4mJSWioVFR4qPJ6KSsvR5btBPwB/H4/kiTh8/kIBIJ07dqFPXv2EggE9VFsMBjE6XTi9/uRZTliRByt3AQNfSaE+88//4zL5aKsrAyvtxKXy4nNZsPvD5CTk016ejpebxXl5eWkp2ewatUqcnNz6dy5M0uWLOHw4cN4vV5cLhc+nw9VVfH7/aiqitvtpm3btmzZsoVdu3bx7rvvUlZWhsfjwefz6ee0d+9e7HY7RUVFjR4Za5rGkSNHyMjI0C0EcW4ejwe3213v78rKS7BZbcQnuNE0qKioIBgMkpSUSFmpB0VRSE1N1a0Nj8dDYmKi3udi8a/X6yU+Pp6qqnD/VFRUADUlq91uN6FQCE3TSE1NpaysTP+9sFIgrHjatWvHRRddxBNPPFFv21sLseC6OxmRvi4q10LBICNSE2JiFNJSaJpGWloa48aNY86cOTGVrFJRFN199eqrrzJr1iyqqqrYuXMnubm5VFZWUlRURG5uLjt25JGb2xGXy4Wqavh8VVT5fHgrKwEZv99PKBQEwO8PoGka2dnZHDx4ULcCAH00HQgE9HYYXVNQvy+8IYFd128bg3H/wnIQgtT4vVGIis/ramdCQgIpKSlkZGSQkJBAcXExLpeLpKQkfD4f69evp6SkBKvVSlxcHBUVFdhsNqxWK3a7HYvFQmJiIi6XC4vFQkJCAqmpqbhcrjoFYdhFCZIsoal1K+f6zjtamUdbk3a7nUAgUOd2PXr0YNu2bUiShM1mw2KxUFXlZeXKVRw4sJ+rr76amTNnYLfbURQVq9XW6gR59DyUyfEnGAyalktjEQ/cgAEDWrglTUeMmm+//XY+/fRTJEnioosuYuTIkbWU5Pnnn1/vfhp6MMXo0Gq1IssyiYmJWK1WAoEAlZWVBAIBunTpQkFBAR6PR18B361bN9LT0+ncubPu2mnO8cV5Nva3whKKntyOVjbR+zXmGrPZbDidTv08ZVnGarWiqiqlpaUR8zKhUEjPTwY1Ck58ZrVa9X2eSAHY0PkKq0W0qUZIK2zZsoWLLrqYuXPnMmjQIO688w5aq9w+edektW5M5dJI9u3bRzAYxOFwxNxN6vV6ueSSS1i7di033ngjTz75JElJSbq7qinWQH3nHh1xJvz/QnkZLRaxH+N2J7JPG2sl1UVdUVKqqurzIeKc09PTdR+/cb5GbG+cMI9WbieqPxpyTxoDMIwBAWLbHj168MUXCxk+fASPPvoot9wyufp8w3N1Jiax49tpYdauXatPgLZ2hIASr+eff541a9bw3HPP8fLLL5Oamhoh2ATGiKP6XvURPTqMjqQyvo+eQDcquKYK1aa4h6IVWl2jduN51ue+MyqJaGUjBLFx4j/6b3TG5eh2iv443q+6+ib6O5vNVqdbUJZlOnfuTJ8+pxEIBFizZk113x71UpjECNFypKmYyqWRFBUV6VFKsYAYHauqyltvvUW7du24+eabdcEnXDLHiqMJMiFQjZFS0ULU+Hl9r1AopI+qhXA3zp0YgwYaaqMg+sGprKwkLy8PVVUJhUIAlJaWsmbNGn1boztNbGNUlOIcjfs3voQVJ7aL7ocThfG40RivVeSrRrlKkkR2djaKEmLPnj1mzRuTCEzl0khEKGv79u1rTfq2NoyjaVVVKSoqwm63x6RLz4hRaUSHUYv38+bN04t+NTTiip5vEa+9e/cyfPhwtm7dqv/+/fff57777sPv99faX2NGdXVNlMcq4lRFfxUXFwMSDocDn88XM9a9SdNp6sDBnHNpJGKk2b9//1YfKWYUXiUlJSiKQmZmZkwLNQifl8/n48EHHyQ7O1u3FIqLi7nhhhvo3r07ixYt0kOHjXMHcXFx+n7EQ7Jo0SLWrFkT8dmRI0fweDzMnz8fTdNo27Yta9eu5dChQ3z//fesWrUKVVWpqqqiqqqKadOmkZKSUktxCOGrqio+n49Vq1Yxffp0nn32Wbp06XLC+ux4YHTnHT58BEmS9UWnrf3ZMGka0XOnTcFULvVgtE4kSWLfvn1YLBbatVTxGRIAACAASURBVGvX6kMaRfsUReGTTz7B4/EwevToiO9ilTVr1jBnzhzuuOMOnE4H//jHS1itViZP/iOvv/4ac+e+jcVioVu3riiKWr1IMcThw4exWGTDyFtj8eIvefXVWSQlJWGzWVEUVV/TMXv2bN26KSoqAuCdd97hl1/CGZOHDh3Kt98u1xeehlO71ITyi4fS4/EwYMAAdu3aTVpaGj6fj/BzqqJpEhJydYjxCe7IX4FkaGx4rYymh1fH8K1lEoWQIYqiNCuKMYZu6ROLWBciBMy6detiRjALF4xx4jk9Pf2E+/SPNaqqcvjwYbp06cLTTz/N3XffRU5ONr///QTy8w/x17/+lRtvnMRrr83mxRdfoEOH9rRpk8bChZ8jy2JyPryKX1VVbrvtf/jii8/ZtOkXtmzZzI4d21mw4FOGDBnCpk2b2LJlC3l5edxyyy0kJydzww03MG/eu9XrO65i5coVtGmThqap1fuPdBuEQiHi4+N55ZVXsNsdZGRk0Lt3TzQtBKiAioYWU8FV4XtLBmQkyYKqajgcDk477TTsdnuEgjVpOg3NGbYEVqu12RVZTeVSDyJUVLB9+/YWbE3TETdCWVlZRHLKWEaWZTZt2qSfy7///f/Yvj0Ph8PB739/Df369dXX6YRCCj5fFd26dWPPnr189dVXet4xCPdPeno6P/zwIx6Ph0WLFvHzzz+zb99+Ro4cyeeff878+fP54IMP6N+/PykpKfz5z39Gli0cOpTPkiVL9P3UF9IbHslLnHfeeVitFixWkGWNI0cKUJQgYQWjVP+NXTQt7HZsrvvEJJLWolh+LaZbrB6Ev1yWZbZt20ZBQQHx8fExY70IAbxixQpkWaZ9+/YnxYSyiM7Kz89nxowZPPvsM7z99ttIksTnny9kwYKFqKpC2BzQ2LRpM5999hnZ2dnk5W2PWHtSUFDA3XffTXZ2Nvfffz+FhYUoikJVlS8iOaXoL1VVGThwIKFQiKeffpqxY8fSq1cvQLjFIvODGdeHqJpCmzapSJLGwfwDpKQmU+Xz4nTEIVtsWGLJL1YHsXxPtTZOFgVtKpd6MCqRHTt2UFRUxBVXXBEzAloIxe3bwwK1X79+TUq02BoxhvPOmDGD7t27c8stk7nllsn6anKv10tSUlKE5Tlz5qtMnz5dXw0vXA+yLNOlSxfOOmsQqqry0EMPctNNNxEIhCLWuFgsFj777DPy8vJ47LFH2LhxI5mZmWRlZUWFUUe2N9INqTF48GAkSSIlORlZlrBarDET2m5EkiJH14mJCS3YmpOL1i5XmoKpXOrBmGhRTO7HUtlbcZOKvGIdOnSIcAvFIpIk4fV6sVqt7N27l3Xr1rF//346d+7MSy+9xCeffEKHDh2xWCz4fD6cTgeSJLNq1SpOO613rQc3FAqRn3+Ihx9+hNLSUrp168aFF17Mnj178Hq9BAIBOnXqxOmnn86VV16Jx+PB46lk/PgLOf/883nrrTfrFQa13GSaRNeu3dGQSUvLwCLbkOzhkgayHDsKpi6PzRlnnFGnW9Dk1MZULg1gdIsBESPf1o5xPYgQgGIOIFZRVZWdO3cC8Pe//53169dx9dUT+OGH1fTt24/NmzczduxYHA4nwWCA3bt3k5uby08//URmZttafZGVlcXrr7/Ohg0b8HgqOfvss1m7dg2zZs1m586dzJw5k9WrV+N2u/n0009RFIW5c+ditVp58sknmth6CUmzgibhdMYhSRbQNFS1aTVhWp5wnRxN0ygpKcHn80WEYpuYCGLprj7OaLVeYTmk8dNPPwLhfEoQzvgZK0iSREpKiv5/bAmB8HUI120JzyFt2rSR7OwsUlKSmTx5Mhs2/MLu3Xuw2+0MGza8ugxAAKfTyYABA+jatSu5uR0jarkIXC4Xl1xyCcOHD8dms+rfb9iwgS1btlBUVMS8efPYvXu3XmCrqKiIwYMH061bdxob5uX1esPbVhdfkyULICNLViyyNcauSc2ApaioEK/XS7t2WeFw6uM4b9TcFCQmLYdpuUQQffOKhXWHATjvvPP0VPKxgAhpHDp0aMxYXNFEFwQ7fPgwkyf/EVVVuOaaa3j88Sf49NPPWL16NR988AFQU8zMarVgs9mpqKjgttv+R5+HURSFtWvXcuutt9Kv3+kEAgH69z+jumCXxMGDB+nUqRO3334799xzDzNnzsTtdvPRRx/hdrt56aWXUFXRproFqtFy/OWXXwiFAoQHLLLuBhPh0bGGaHd5eTk+n6+6AJo1wjI8logUP4Be0Cy2rL1TE1O5HIXwvEtYUDidTj2KrDVPxIqHfPPmzeTn53PZZZdFpDqJNYzRWpqmkZqaFrEWQFVV5syZw2uvvQZATk4Ozz33LNdffx0A27Zto3PnzvocmsVioXfv09iyZStDhw7D6XSQlhZO5pmens5jjz1G+/btqayspLS0FFVVsVqtlJaWMnz4cMaNG9eofhR9vnXr1lafMqixGAcpRUVF1VbZ8T+m8XmLxXv4VMRULkchfCPXzmrbmhECYN++fZSUlOifx0qkm0AYLCKowmq1oigKBw8e5IknnmD58hUEAgFWr17Nxo0bef/992nTpg0XXHABDzzwAL169cRqtXLBBaN4443XufDCC3X3lsUik5yczIgRw1FVlW+++QYIW0aPPvooFRUVbNu2jQMHDjB+/HgGDx5MTk4O119/va6gGupHY+qZ8vLymLQaj0YwGDwhQSLGdUSxHvF4KmFepXoQPt5wvfEQmZmZEUWTWjOifZWVlTH/IIoQ46qqKjQtXOd9y5bNvPTSP7HZrMycOZPFixezceNGli1bRnFxMVOmTKG4uIQVK1bQvXt3unfvzmOPPRZRlljTNAoKClBVjffee5+MjEz8fj+5uR158sknKSws5C9/+QuLFy9m5MiRzJs3jwMHDmC1WnUFdbR2AyxfvpzXXnsNWZaZM2eOnuvtePbXsZ6fMO6rrv0b1/McD4z52mI9KOVUIrYlz3FEjJAqKiooLS2hZ8+eOJ1OoPWP/IUC/P7772utHm/tirEuqqqqdGEeCoX4zW9+w7vvvsNnn33Gm2++SefOnRk/fjyyLDN27FhOP/10Nm3ayJgxY/jvf//LtGlT2bhxE4888qjeHz///DMZGen07t2LLVu2cMYZp5OXl6cHa2RkZLBnzx7atm3LggULeOmllzj77LN55ZVXUBSFzz//nIMHDzbYbpF257XXXmPVqlXceOONuFyu495fguOlYIz3vyRJx7R0Q33Eqkv3VMZ0i9WDGI3l5+eza9duzjxzoF44KRZW6UuSxMaNG/XJz9be3oYQc10ivb6mwahRo5g27WE++eQTfaJdVVVsNhvBYJB27doxadIkFi1axKZNGxk+fJg+9yFJEv/617+48MKLWL36BxRFYciQc9m+fRsej4cRI0YgyzJr167l//7v/6iqquLjjz8mMTGRESNGcP/99/Pll18yZcoUbr755nrbLUnhGvRCuZ955pnH3Y0UXS/mWO8batZOiXtq+PDhEd/H8r1mcuwwlUu9SEgS+Hx+vF4vFos1ovRrLCAibDp27BgTCjGa8Epw9BLC3333HX6/Xy9klZiYyLXXXsuoUaP0VfIjRoygbdu27N+/H1VVmDBhApmZmXzxxSKqqqr0tC5Tp04lJSWVESNGMHDgQBITExk06Kxq11lYUC5YsICrr76av/3tb5xzzjkAzJw5k2uvvZZ27drpeczqb3/kCF+s9j9e1qMY+IQzL8u43e7m7qnezxVFJRAI4HA49OPF6v1lcnwxlYuOhHHdgiSF3RoeTyWqWlNlMFbcSkZX2Pnnn9+oSejWh4Qs19yimzdvJSEhkezsHBRF45FHHolI0/Lwww/z4osvoqoq5513HiNGjOCiiy5CkixYLFYSEhIBsFhs9OjRi4KCAtq378ANN0xCloXQDwdwWCwWxo4dy7x58xgzZoye/POiiy7io48+IiMjg44dO9bf8uNgOTQGWZZ19+2vwzjPYkx6Gq5P43A4CAaDWCwW4uPjq7czFYxJDaZyqQdhpaxfv15PnxKrD098fHyEYozFcwC45JJLGDJkCD179qxzQn3o0KEMHz5cdwWKcOXooIZwkkkr2dnZLF68GKhxgxoDOcQcjvgNhNdZjB49ulXeC2JAIeZAjlUbjfdOIBDAZrOhqiqfffaZ/r2xDSYmYCqXehEPyZYtW9A0TXeLQOyN0Iy10mN5vUWbNm1o06ZNneGoYq5BuJ6M20Rbm0II6xmLq5VQ9HbGUgXGkgWt9do3zapuaNvapZwFTqcTRdHYtWsXixcvpkuXLrqrz1h+wMTEVC4NoKoqpaWlAGRlZcXUQkRN00hLS0OWZbxeL6mpqfpEbFOCEo7FuUaHsja07+htoy2u6DT4xu1tNluE0jGeZ3Suteisx0alJL437lusDDcqIaPiiVZkxnUZ0cJXfC8UfXSbG+pz4znVt51xH8ZrHrUVxvVbxvYb+93YT2IfBQUFTJkyhf379/Pggw/qbrFjSV0DApPYwlQu9WB8eMX71rwq34gYiXfv3h1Jkrj22mtZsGCB7osXQs0oPIyjzmO9lscojMWxjNZA9Kg3WgmKfYRCIaxWq35+4npEC3TjMaJX90ePro3CU7jCoi0b4zGM70VwgLFqqXG/gUCAyspK3G43BQUFJCcn4/F4CAaDuFwu/P5wsIgsy9jt9oiSsqFQiFAoRCAQiMjQLY5rbKv4LLogXENWqka4eqaqKBQVF1FSXILNbierXTt8fj8lxSUkJyeTkJCI2KWImps9+3WKiooYNWoUDzzwgCn4TerEVC71IIRNeXk5aWlpvyLy5sQjhMztt9/O8uXLWbFiBdOmTeOqq66ivLwch8NBYmIixcXFJCQkEAqF8Hg8EaP4hpRLtPI5mjIyjtLLysooLS3F4/Fgs9morKwkEAhw8OBBDhw4QE5ODtnZ2eTn5zNu3Di2bt1KaWkpffv2JS8vT8/Au2/fPvLy8vB6vQSDwToFnFHQd+3aFbfbzdatW7Hb7QQCAXw+X51KJFpQp6Wl4fF48Pv9Dbp+oi0VVVUpLCzE7Xaze/du2rVrR1FREYqikJCQgNfrpbi4WC8lGwwGCQaDOJ1OAoGA3kar1UooFNItJOPxRb+KberqgzrbLGnVedZCenRceN9qOPeZVnM+0VFvSUnJ/N///R8TJkwgMTGx3uv+a4geKJjEHtLXReVaKBhkRGoCNptZ/1qgaeGU4gMHDqRz5858/vnnMdM/YiGgJEmUl5dz8cUXs3r1auLi4qisrMRqteJyuaioqMDhcKCq4fBSozvkWM7NREfaRc9hRFsbRqIFqdFaMLpwLBZLg9mqhZUjfifca8KVFgwGkWWZ0047jZ07d+LxePRjGtsSHx9PSkoKAwYMIC4ujr1795KdnY3FYmHv3r0kJSXh9XpRVRW3283hw4dxu916JdBAIMCRI0do06aNvgDR5XLVqbCMAtZut+sKJjMzk6KiIoB6Faugf//+lJWVcc4556CqKlu3bsVisZCUlMC+/ftIb5PG5i1bsNttVFRU4Ha7SUlJ5bTefVAUBY/HQ1paGsFgkOTkZBRFJTs7h9zcXL2Nx8uiF0EUseIxMKkhGAyalkt9qGo45HLv3r306tXrhKxCPlYY686kpKSwYMECnn322QhhfrTJV1mWsdls2Gw22rRpQ0FBAVVVVcTHx+uC1/h7MfIWx9Q0jdzcXGw2G7/88gtjxozRa3+kpKQwd+5csrKy2LJlC253HGlpqcTFxdGnTx+9IFiHDh0iQpEFgUCAUChEXFwcXq8XSZJwOBx4vV68Xi9paWm6QAoEAlgsFn3OJLoPAF3R9OvXjy+++ELPnGzsC+N7i8WCy+XCYrHo0VPCDWZMDWOcIwpnXA7fV2IxqNGl1VjqshLru5Z1WZOjRo2q/k3dhb9aC0Z3qBkkEJuYlksDHDp0iJycHCZNmsSMGTNi9gYX6xGEtdBYYRY9N1Ovi6WautxCDQk8YYnIcs0oVcwj1Hxnjdg+GqOyiI4iq8sSqAtFUaisrCQ7O5vLLruM2bNn6/uMvbVBJw+mWyx2CQaDZm6xhhA391lnnRXTN7gxWuloGCOijCPrxkwUR7tI6po0Nx6nxnIQCzxlQKpetBp+H71/4/xNNEKxRCu1owUnSFI4HUwwGGTt2rW6++lYBzaYNI1Yicw0qRtTudSDUch26tQppoWM0VoxWiBNeRkxKqu6osuivzO2QSgfq9WqKy1ZtiBJYeUiimnVpVyAWqG9xnMUf6NTrNRlPYnoMTHpPn36dM4880z27NnDunXrIhZhmrQMRwssMWndmMqlAUS99lgfQYn2WyyWo7rEopVKjQKQIxZjRu8n+jvjb4wvMYkt2iNexvYZX9FtM25bX1uj30dfPyG0RLjvl19+SUlJCd27d8fr9ZKfnx9xXiYtQ6w/d6c65pNTD5IksXz5cv29yclDtMXzn//8hzZt2pCTk0N8fDw//PADoVCoUXVbTExM6sZULvWgaRrFxcXA0ddxmMQmkiTxww8/kJeXx1lnnUVpaSmDBg3io48+0qtHmpaLiUnzMJ+cBtA0DZfLFVMLKE2OjqapaJqCJMH/+3//RpIgOTmJjz+ej91uY9u2bezfv9+0WE1MfgWmcqkHEdaalZVF165dW7o5JscQEQxQWHiE5cuX07t3L/x+HxaLzJAhQ0hJSWHOnDl6ShcTE5OmYyqXepBlmZ07d5KUlERKSkpLN8fkGCIiwd566y2Ki4ux2Wz8//bOPL6K+tz/71nOyb6ShCVEQAnIvl0Ea7VqW6kWq23tD7F661JaFe0VwX0BbWvrgmBEexVlU4sgV1A2AZFXUQGRWjaVsqmQQMienOTkLDPz/f0xZ+bMyUYgJ+XWOx9eeeVwMvNdZ57n+T5rTU0NOTk5KIpCz5492b59O42Nje7pxYWL04QbRNkKDMMgLy+P3r17s337dtdz5VsEw9BpaKgnM9MUGlJTUzn33P4IIThw4AC6Lqivr+fYsWN07drV3XcXLk4RbvqXk6CmpqZZokAX3w4oisKiRQvRdYPDhw/z7LMzSUpK4k9/+jODBg1m5syZrrDlwkUH4J5cWoFhGKiqynXXXceCBQv+rXKLuWgbZpyLHhOkN2DAQOrq6igpKUaSzEBPq2Kl6zHmwsWpwU3/0gZKSkqQJImLLrrIzcr6LUPTxJ1WgsmsrMyY2jNuXjEXLk4frjjugDMn1Y4dO5AkieTkZNtzzCU03w5YjEWWnXnQZAYMGBRJPSO5jMWFiw7CZS4RNE3x/c033wCQnJzsEplvGczTSpSxWFUdhw4dGslt5h7oXbjoKNy3qBXouk5SUhJnn322G+vwLcfBgwepqqoiISHhTA/FhYtvDVzmEkHTFC/V1dURF9VzXRXJtxxWITQ3xY8LF/GDy1wcsAy8siyzadMmZFm2Kwi6hOfbi6qqKrvMc1MYhmHXd7HKFzvT9btw4aJluMwlAmf9eDCl2ZaKXLn49uFkhcGsAmWzZ89m165dAG7skwsXJ4Fr0G8Ci8g0NjZSWFhof+fi2wvLicNKC+M06DsZzrRp02KYkPtcuHDROuLOXCxVQdOaGdGX1Po++n/rUqfgGP0ufi+yQMR0IknRUTj7sn6PGTOm1dK8kmQ1ZcVMtNJnCxKuJAnzegmkyOEx2o+zIQnnOjWFNYboWGI/tyZdx4soOoMQzSqS0e+t8TrHY84l+n08+ne2FbsH0b6i6yCa/B1AYt2695Ak7OzXzmfYioFpWrzMeqadaxz7rMaufeyzHXtviyWZJccNwhxn7FpabREpCx3bhiRZ43AZoIszg7gzF6cUCBJCGEiSHPktOV5EMF9AsFTX5ssTJdYtvbgdGhsGoDtojGS/ewKQJMWu42IYBtnZ2Y6+DXvcpvosmjlZ142YmImmbs0WURJCj9xrIBBIQkY4mK0QBkYkFbwkSSDkmNibaDuxDMcwokTNMCKMi5bXLV450oQQ6LruKDts7a+1t9a+x47Buq65kHE6iO5JzLcRm4iTiDtPJboeRlEkDCFASAwaPBBFUfjud7+Loijoum63A2ZJZmcbTQUeTdMisTFSxBYTq2K1xihJMqFQiKqqKtLS0gBITEy018MwDE6cOI7PV4duhAkEAoTDIZISkwkEQiQlJVFYWIiuG/h8Pqqra6ioKMPv96OqKiNHjiQrKysyZ1AUVzHh4swh7k+fpZ8WQhAKBfnsHzs4ePAghm7gq/cRDIYIh7XoABSZxKQkUpKTSUlJQVEV/A1+KioqCYe1ZqeJjg1OIIRGOGwSD1VVIwQBNE2n9HgZ1dXV+P1+ysvLWbt2LbquR4iUTlVVNcXFxZSWlhIMBgiFwqiqQkpKKpIkEwgEyMzMpE+fPgCUlpZSXl4OQH19feSeUEQqFei6gTAkNE0jEAgghKCw39nU1tZSXV1DOKSRlJQEQDAYBGhG3Jy2oijDji3x+5Of/ISioqIYIhkPWO1//fXXLFn6JrIkkZWdRY/uPejevTs+n4+Kigr8fj++eh/+Bj+a3oIR/LS3VsScnsxAV2ho8Nt7WFtbi8fjISsrk+PHS+nfvz8ej0paegqffPIJHo+HbVu34/V6uPvuKVRVVVNRUYFhGPTs2ZPi4mK8Xi/hcBhd10lJScHv98cweifjgej6Og3+ToFJ1/WYktOWUACCUCiEYURS00SYp4S5v4qikJDgjbRhoGk6uq7bDLtv37488cQTXH75j+yxuao7F2cKcc8tpmkajY2NLFy4kKeffoojR4/aagtZjkrWpnTeXOq0IDrJEUeWJQSieb8C21MsSiiwiUBCghePx0MwGETTNJvYeL1egsFQMzWgUxVopY9RVYVwOIyiysiyRDAYBmHe5/F48HhUEhK9KIpCSkqKvQahUIjGxkYswmURKlVVI5KvuY7mmDS83kQUxZxHaWkpgUCQ7t2788Ybr0ek847LFOFwmNWrV7NhwwZeffVVgqEgsuxU+USWVYAsEyGs5udmTlZx9peQZXM9MzMzqayssomsx+PBMAx0XUP1qHb2BdsDzMD+HA6H8Xi8pKWl2io/j8eLqqrouo6uazQ0+MnKyrTXw+v12ipBc55OFawU+d4UvtLT0zlx4gR5eXn4fD6sU755LY53REII8z7LQ01RzOcxrGmkpqTh9XooKyujtPQEAK+8MpeJEydGxu367Lj41yMcDnecucTq3SUCgQDXXnstq1evJic3hwHn9mPI0CHk5OQAEl6vh/T0dDIyMjEMU/LyeDx4VI8pyVkMR0Slunh5a8myFJES9dauaHK9jMfjISUlhezsLNLT06iqqqKmpoaGBj+aFkZV1cgJK/YkYY3dImperxev10NdXS1er0nc6xsaQCh4vSYRS0xMID09lfT0dLp27YosqyiKQkVFBSUlJZE2vBE1lCA5OZnMzEybqNXV1dHY2Eh6ejrJyckIIXj33ZWsX7+el156mT59+vDRRx/SvXuP01o/pyQ+f/587rrrLgAGDBhA1265FBb2xTAEGRlp9OrVm5SUVEpKiikrK6ex0U9aWhoFBQVkZWVz4kQpQgjqfQ2kpWXYtVSaStpOtWDTv5nVJKP2LqdaLjExkX79Cvnyyy/tvUxPT6e+voFAoJG09DR69OiOv6EBVVVpDDQSCoVBCMJhHZ/PR0pKCv3797dPhunp6WRlZVFVVUUwGOTo0aMMGTIEVVVpaGggJSXFDr41xxer1nV+FkJQXFxMQUGBQ00Ya8OJPIUxNiNTdWog25eY9waDQV5//XWmTLmbrKwsPvlkG92793CZi4szgrgwF6eaxjAMHnjgAZ577jl+9rOf8Yc/PE6v3gWoimraGCwbh3BKuFGjZuxLpRB/Y+TJmFRb/bV1lGpuOG2qrrHaMI3DETWfJCFL1pqbahGzBK9pk5Gl2BNGS4y2KcECs16JrESIEhL1DfVcOf5KPt6ylTnPz+HWW29rYy6tw1TBCA4dOsQFF1yAz+dj8eLFjB8/HkkyTKlcRLytIrYpyxhu7bsQAkmWMPSI+y8gObSzziShzjlZcKr0dD0cQ4zbSjDa1NEkauAXaJqGpmmoHsXMLWbtZYRTmSqqyBSEdfqN7HrMMxt9DpzxMOa4BH5/A4lJSZFTjse0i8gKmq5hGDoej9d28IhlCk67nMAwwvj9DRiGQVp6pj1eTdO46aabePPNJfz4x1ewYsU7LnNxcUYQ16zIhmHwyiuvMGvWLIYOHcrcuXM5++y+KHICkqQiSx4kSQWhIoSMbkiAghAyQiiY5h/F8dMZkE7y0/mwCK4hjBZ5nWEYhMIhmxC3RGBbg82kZZPcyJIEkiAlJZnf/vY3gGDjBxs7NP5wOMwjjzxCdXU106dP5/LLL4+oElUMQ0aRvSAUJEnFMCRzz1GQUJGkyA8qsuwFVCQUW9XX1AgO2Koga35NZmzfc7KARqeqMurwYP74Gxup89Vh6EbEJmb3bv+TwNwXBIYwEIaB3uoJmIjNMUQ4HAagtraWY8ePocgyimLZyEwbja0Oaz5qU21q8kBM1ZmlL4Njx0tinhNVVRk37kfIssTu3XvaXA8XLjobHWYu1ksryzLz58/H6/Xw1FNPkZSU5IgZiL7Iph5YQUJBkmQURXVIVy0TeyeRjSW4LX/flhNAa9e31kY81ibapmk/qayqdHrKxkCWZbwer237sX6ihLVlJhhj5xE4iKJ5/ejzzjNtAKcwrZh1iPyqqqri7bffZtCgQdx66612vRMz4aOCEFJkPyP7HPkshBSxtciYzljWs9D8EXT26/f7KSoqYv369S3u0ZIlSzh6tDjGqaGlvdN1nePHj5vMg6gNSAjTBblLdjaqquLz1doMAQFSZJyGMKisrEQAsiRTXFKCv8Ef02fUzmSqRhMTE0lKSkKSJNLS0mxHD1mWUWQFVfGABKqiNjl1tf5aShH/+cTEBPJyjjSw/QAAH6pJREFUc2nqhZmf3wOPx4ssx55o46VaduGivYiDt5jlpiuorq4iJ6cLF198USuqLhPN4z5O0oNDMj106BAbNqznV7/6T9uuYBV1Wrv2PdasWcNTTz1NUlKSrZJwqo4shhfrJmqqVizPsJbT658aH472aRqQreJjXq+XrnndW7qDKMFtq922+7VUUubFBmAgRQzCCCnGZfpUYLpqS7a9Z9iwYbardttoqjbCJnzO1s15iYjBXbfVX4cOHeCee6Zx9dVX8/3vX2IzWyEEW7duY9Kk3zJlyhRmzJiBrpunAMtrzKlCU1UvPXr0BEy1YTgc5OWXX6ZXr96MG3dZ5BqFzIwcTAYYFZpkSUJWPOT36BVRdwm65vWIPE8yJSUlLFq0iB//eDyKIrN792ccOLgfVfVw8fcuYfDg4aSnpyEMAyGUiOor+oxJchtPV5OlMgUyLwpeunRJoam6NhAIoOuaQ9hoxxa5cNEJiItaTJIk28jZrVt3B2GNR+tE2jKlr1mzZjFjxmMcOXLUjkdQVZUdO/7OHXfcwcsvz+W9996z72kKpyeYs+0vv/yS119/naqqKtu2EC9IksTevXuZP39+3Npsu0Oa0XTL4aBnz4JTbs46JULUwN6/f/+4DLW1/qz1X7x4MZmZmdxwww0xLr579uzh17/+NYMGDWLOnDksX77cPjFASyq0WITDYR577HF++ctfsnbtWpthKYpiewi21EY4HLZzzll55zRNY9WqVYwefR6jRo1ixmOP8+mnf2fVqtVc8ePxXHLJJRQVPU9paWmn5yOrq6uLuDq7MS4uziziwlyEEOzZs4fy8jJ69uxpE4Z4uthLkkRjYyPr16/niSf+SGFhX1s6q6ys5L/+679ISEigX79C/vznP1NdXd2igddWeURgMZLHH3+cSZMmccMNN1BfXx/X+ADDMJgzZw7z5s2341U6F9Zp0jxRSsA3X3+NEDB27NiT3BfrPmudKIQwY4727t0LwJAhQzpr8Gzfvp3bb5/MG2+8wbvvvktubi719fXMnTuXtWvXUlNTw5Qpd3PWWWexdu1arrzySqZMmcKRI0faRbwlSUJVVZYuXcI555zDLbf8mo8//ti+NxwOo2lai/c6y11bJ+HevXuzfv16Ro/+D8455xzWr3uPd99ZwYYN6/hg4/tkZ2czbdo0nnvuObv/zoKmaei6QV5enqsKc3FG0WHmYul86+rqCARCDBhwblxOLpb0GggEWLhwIXPmzOHOO+/km2++Ydu2bcye/RzPPfccmqbx0EMPU1payurVq3j22WfZtWsXv/vd72hoaACwVS2GYRAIBICojcKSVF944QWmTZvGxo0bue++++z7LI+f9r6o1rXO009dXR1vvrmEzz/fy4EDBxztnv76nHwMZnCdYZjOA59s344kQc+ePU9yt8mQnHMRQkM3TGP2oUOHgGiqlI6PlWZrvH//fhYuXMhNN93CoUOHSUpK4pVXXmHatGksW/Y/TJ48meLiYubOnUt6ejq///3vSU1N5brrruOLL76IsXO1tn8ej4fvfve7zJr1LNXV1cyY8ZitFvV6va16TjpPRrIsoygKhmGQlJREamoadXV1trowNTWVkSNH8fzzz6MoCuvWrYvLmjVfw6hdxXr3evToHhNn48LFvxpxMOib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BLj55pvZsmVLi5URrd9Lly7lqaeeIiEhgZdeeon6+npkWcEwzJrnVVXV3H//g4TDGllZXbj55ltYsWJFiyei+EACFPZ9uT/ini3RkS727v0cXTfIyspGCEvNKBy/Tye9uwB0+6ew8ByefPIJFi1awP79+zAMwa9+9Z+cd955rFmzhqSkJD78cDPTp08HTPvP2LFj6datGz6fj8GDB9v2DcMwY3Q++GAjV119JV/u+4Ln58ziuut+TllFCULoZqZoySz7INBB0rnwwgt45JGH2bNnD1dddRVr1qxG08JIEjQ0NMTMUVEUfvKTn/Daa4t45513mD9/Hi+99BIvv/wS8+a9ytq1a1izZg0XXHCBGVypqng8nphAW7OEdRQNDQ12aYCTwTx1mZtaXl5ObV0tSCISy3MK2+DCRZwRhzgXU+/cv3//dqZgbx8sD56ZM2eSmZlJQUEBd911FyNHjiQtLY19+/bR0NDAypWrqK+vZ82atWRlZTNkyFAKCwu55557GDVqFFlZ2ei6aV+pra3l9ddf55lnnqFbt2688MIL5ObmAjhqz8SO4bLLLuO2226jqKiICRMmcP/99zN58uSYay3mMG7cODZs2EC3bt3Iy8uzSwJYMQcZGZncfffdPPzww3Tt2hWfz0dmZqbdl4irjjzqJltZWY2qqCQmJnao/fLyChISEsjJMddMCPD56klLS4tRR50ac4FYLz6DidddiyIrBIIBu01N0zh48KB5hWGwf/8/bTXiH/7wB06cOMGLL77IyJEjUVU1suaCjRs38tOf/hRJFhQVzeL666/lq28O4vV68fv9JCdnIEkyiixhiBChUBBVSeTee+9BkuDBBx/i+eefZ+zYMeTl5TXzHOzduze9e/e2x2WNNxAI2DnHrH21Alib7rUzGSZARkaGvY4n26+SkhJ69DAzAZi2O9P+4jIWF2cacWEusiyTk5MTU4ejo7BSmw8fPtzWiS9dupShQ4cihGD37t34fD6CwSA33ngj+/btY/To0YTDYd555x02b97MFVdcYdeXB5gyZQp//etfGTRoECtWrCA3N9d+0Vsat2UoffTRRwmFQrz66qu8//773HbbbTH2ESsKPD8/n/z8fCDqKWTVmrGY15gxY2yp1VqzTk0Fg0nMsrOz45I9ISUlhVGjRtn/t7yULGk+LnmsIsXOjh4tjhBJ0xV66dK3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"
    }
   },
   "cell_type": "markdown",
   "id": "6610752a-ab3f-4e3b-9c1b-6a3fbc0b0c7a",
   "metadata": {},
   "source": [
    "![image.png](attachment:daf45782-d21a-4706-ba25-69b14cb3eb94.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "c653c4aa-dace-4cc3-aa3c-84328fd08527",
   "metadata": {},
   "outputs": [],
   "source": [
    "input_A = keras.layers.Input(shape=[5], name=\"wide_input\")\n",
    "input_B = keras.layers.Input(shape=[6], name=\"deep_input\")\n",
    "\n",
    "hidden1 = keras.layers.Dense(30, activation=\"relu\")(input_B)\n",
    "hidden2 = keras.layers.Dense(30, activation=\"relu\")(hidden1)\n",
    "concat = keras.layers.concatenate([input_A, hidden2])  # 合并\n",
    "\n",
    "output = keras.layers.Dense(1, name=\"main_output\")(concat)  # 主输出\n",
    "aux_output = keras.layers.Dense(1, name=\"aux_output\")(hidden2)  # 辅助输出\n",
    "\n",
    "model = keras.models.Model(inputs=[input_A, input_B],\n",
    "                           outputs=[output, aux_output])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "c6177d79-026c-41a2-911a-ce61d9949504",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(loss=['mse', 'mse'], loss_weights=[0.9, 0.1], optimizer='sgd')  # 更关心主输出，设置权重9:1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "81b5697c-6c96-4c27-8bea-cec3471becb2",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "363/363 [==============================] - 1s 1ms/step - loss: 1.2686 - main_output_loss: 1.1843 - aux_output_loss: 2.0266 - val_loss: 0.6228 - val_main_output_loss: 0.5460 - val_aux_output_loss: 1.3141\n",
      "Epoch 2/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.6123 - main_output_loss: 0.5359 - aux_output_loss: 1.2995 - val_loss: 0.5491 - val_main_output_loss: 0.4825 - val_aux_output_loss: 1.1485\n",
      "Epoch 3/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.5569 - main_output_loss: 0.4929 - aux_output_loss: 1.1325 - val_loss: 0.5098 - val_main_output_loss: 0.4553 - val_aux_output_loss: 1.0006\n",
      "Epoch 4/20\n",
      "363/363 [==============================] - 0s 992us/step - loss: 0.5283 - main_output_loss: 0.4762 - aux_output_loss: 0.9971 - val_loss: 0.4853 - val_main_output_loss: 0.4400 - val_aux_output_loss: 0.8934\n",
      "Epoch 5/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.5120 - main_output_loss: 0.4687 - aux_output_loss: 0.9019 - val_loss: 0.4828 - val_main_output_loss: 0.4457 - val_aux_output_loss: 0.8165\n",
      "Epoch 6/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.4899 - main_output_loss: 0.4534 - aux_output_loss: 0.8182 - val_loss: 0.4585 - val_main_output_loss: 0.4262 - val_aux_output_loss: 0.7493\n",
      "Epoch 7/20\n",
      "363/363 [==============================] - 0s 992us/step - loss: 0.4768 - main_output_loss: 0.4454 - aux_output_loss: 0.7593 - val_loss: 0.4511 - val_main_output_loss: 0.4235 - val_aux_output_loss: 0.6989\n",
      "Epoch 8/20\n",
      "363/363 [==============================] - 0s 989us/step - loss: 0.4729 - main_output_loss: 0.4452 - aux_output_loss: 0.7225 - val_loss: 0.4471 - val_main_output_loss: 0.4227 - val_aux_output_loss: 0.6662\n",
      "Epoch 9/20\n",
      "363/363 [==============================] - 0s 995us/step - loss: 0.4588 - main_output_loss: 0.4336 - aux_output_loss: 0.6857 - val_loss: 0.4258 - val_main_output_loss: 0.4020 - val_aux_output_loss: 0.6399\n",
      "Epoch 10/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.4443 - main_output_loss: 0.4210 - aux_output_loss: 0.6545 - val_loss: 0.4310 - val_main_output_loss: 0.4113 - val_aux_output_loss: 0.6081\n",
      "Epoch 11/20\n",
      "363/363 [==============================] - 0s 967us/step - loss: 0.4371 - main_output_loss: 0.4163 - aux_output_loss: 0.6248 - val_loss: 0.4108 - val_main_output_loss: 0.3913 - val_aux_output_loss: 0.5863\n",
      "Epoch 12/20\n",
      "363/363 [==============================] - 0s 995us/step - loss: 0.4325 - main_output_loss: 0.4124 - aux_output_loss: 0.6134 - val_loss: 0.4123 - val_main_output_loss: 0.3950 - val_aux_output_loss: 0.5685\n",
      "Epoch 13/20\n",
      "363/363 [==============================] - 0s 979us/step - loss: 0.4351 - main_output_loss: 0.4178 - aux_output_loss: 0.5910 - val_loss: 0.4002 - val_main_output_loss: 0.3832 - val_aux_output_loss: 0.5538\n",
      "Epoch 14/20\n",
      "363/363 [==============================] - 0s 970us/step - loss: 0.4267 - main_output_loss: 0.4100 - aux_output_loss: 0.5765 - val_loss: 0.3932 - val_main_output_loss: 0.3764 - val_aux_output_loss: 0.5447\n",
      "Epoch 15/20\n",
      "363/363 [==============================] - 0s 965us/step - loss: 0.4113 - main_output_loss: 0.3939 - aux_output_loss: 0.5675 - val_loss: 0.3803 - val_main_output_loss: 0.3642 - val_aux_output_loss: 0.5250\n",
      "Epoch 16/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.4058 - main_output_loss: 0.3890 - aux_output_loss: 0.5575 - val_loss: 0.3748 - val_main_output_loss: 0.3588 - val_aux_output_loss: 0.5185\n",
      "Epoch 17/20\n",
      "363/363 [==============================] - 0s 973us/step - loss: 0.3968 - main_output_loss: 0.3812 - aux_output_loss: 0.5366 - val_loss: 0.3731 - val_main_output_loss: 0.3582 - val_aux_output_loss: 0.5072\n",
      "Epoch 18/20\n",
      "363/363 [==============================] - 0s 976us/step - loss: 0.3935 - main_output_loss: 0.3785 - aux_output_loss: 0.5285 - val_loss: 0.3645 - val_main_output_loss: 0.3500 - val_aux_output_loss: 0.4943\n",
      "Epoch 19/20\n",
      "363/363 [==============================] - 0s 975us/step - loss: 0.3893 - main_output_loss: 0.3753 - aux_output_loss: 0.5154 - val_loss: 0.3697 - val_main_output_loss: 0.3558 - val_aux_output_loss: 0.4943\n",
      "Epoch 20/20\n",
      "363/363 [==============================] - 0s 998us/step - loss: 0.3841 - main_output_loss: 0.3706 - aux_output_loss: 0.5061 - val_loss: 0.3720 - val_main_output_loss: 0.3592 - val_aux_output_loss: 0.4875\n"
     ]
    }
   ],
   "source": [
    "# 主输出和辅助输出应该预测出相同的结果，因此标签用[y_train, y_train]，验证集和测试集同理\n",
    "history = model.fit([x_train_A, x_train_B], [y_train, y_train], epochs=20, \n",
    "                    validation_data=([x_valid_A, x_valid_B], [y_valid, y_valid]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "cce825d2-57ea-4f17-8a4f-fb5c057e7ae5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "162/162 [==============================] - 0s 700us/step - loss: 0.4008 - main_output_loss: 0.3854 - aux_output_loss: 0.5397\n"
     ]
    }
   ],
   "source": [
    "total_loss, main_loss, aux_loss = model.evaluate(\n",
    "    [x_test_A, x_test_B], [y_test, y_test])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "a39cd7fa-c28e-4363-b28e-b55b91d5ea2b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:5 out of the last 6 calls to <function Model.make_predict_function.<locals>.predict_function at 0x000002B69A90C1F0> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.\n"
     ]
    }
   ],
   "source": [
    "y_pred_main, y_pred_aux = model.predict([x_new_A, x_new_B])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "d1c3e4af-f7a9-4d4d-bb81-d5711f341eed",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.2369733 ],\n",
       "       [4.0595145 ],\n",
       "       [0.56709504]], dtype=float32)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred_main"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "999da243-0063-4cf0-aec4-fd1545024610",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.2009141],\n",
       "       [3.3168094],\n",
       "       [1.1419346]], dtype=float32)"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred_aux"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ccfea62e-06d4-4dff-9441-5d280a61bab9",
   "metadata": {
    "tags": []
   },
   "source": [
    "# 构建动态模型（类封装）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "198d2cbb-1004-4333-8078-59d915926151",
   "metadata": {},
   "outputs": [],
   "source": [
    "class WideAndDeepModel(keras.models.Model):  # Model子类化\n",
    "    def __init__(self, units=30, activation=\"relu\", **kwargs):\n",
    "        super().__init__(**kwargs)  # 继承父类的__init__并重写\n",
    "        self.hidden1 = keras.layers.Dense(units, activation=activation)\n",
    "        self.hidden2 = keras.layers.Dense(units, activation=activation)\n",
    "        self.main_output = keras.layers.Dense(1)\n",
    "        self.aux_output = keras.layers.Dense(1)\n",
    "        \n",
    "    def call(self, inputs):  # 重写call()\n",
    "        input_A, input_B = inputs\n",
    "        hidden1 = self.hidden1(input_B)\n",
    "        hidden2 = self.hidden2(hidden1)\n",
    "        concat = keras.layers.concatenate([input_A, hidden2])\n",
    "        main_output = self.main_output(concat)\n",
    "        aux_output = self.aux_output(hidden2)\n",
    "        return main_output, aux_output\n",
    "\n",
    "model = WideAndDeepModel(30, activation=\"relu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "4d68b2d2-30f8-4553-a4ff-14d41ff861ed",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "363/363 [==============================] - 1s 1ms/step - loss: 2.4470 - output_1_loss: 2.2738 - output_2_loss: 4.0055 - val_loss: 1.1870 - val_output_1_loss: 1.0091 - val_output_2_loss: 2.7881\n",
      "Epoch 2/10\n",
      "363/363 [==============================] - 0s 959us/step - loss: 1.0476 - output_1_loss: 0.8932 - output_2_loss: 2.4370 - val_loss: 0.8581 - val_output_1_loss: 0.7308 - val_output_2_loss: 2.0042\n",
      "Epoch 3/10\n",
      "363/363 [==============================] - 0s 948us/step - loss: 0.8237 - output_1_loss: 0.7114 - output_2_loss: 1.8346 - val_loss: 0.7310 - val_output_1_loss: 0.6406 - val_output_2_loss: 1.5442\n",
      "Epoch 4/10\n",
      "363/363 [==============================] - 0s 967us/step - loss: 0.7367 - output_1_loss: 0.6481 - output_2_loss: 1.5346 - val_loss: 0.6736 - val_output_1_loss: 0.5981 - val_output_2_loss: 1.3527\n",
      "Epoch 5/10\n",
      "363/363 [==============================] - 0s 946us/step - loss: 0.6889 - output_1_loss: 0.6117 - output_2_loss: 1.3833 - val_loss: 0.6389 - val_output_1_loss: 0.5718 - val_output_2_loss: 1.2435\n",
      "Epoch 6/10\n",
      "363/363 [==============================] - 0s 923us/step - loss: 0.6564 - output_1_loss: 0.5856 - output_2_loss: 1.2933 - val_loss: 0.6134 - val_output_1_loss: 0.5502 - val_output_2_loss: 1.1815\n",
      "Epoch 7/10\n",
      "363/363 [==============================] - 0s 956us/step - loss: 0.6320 - output_1_loss: 0.5650 - output_2_loss: 1.2344 - val_loss: 0.5928 - val_output_1_loss: 0.5319 - val_output_2_loss: 1.1413\n",
      "Epoch 8/10\n",
      "363/363 [==============================] - 0s 932us/step - loss: 0.6128 - output_1_loss: 0.5481 - output_2_loss: 1.1947 - val_loss: 0.5769 - val_output_1_loss: 0.5183 - val_output_2_loss: 1.1037\n",
      "Epoch 9/10\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.5978 - output_1_loss: 0.5356 - output_2_loss: 1.1582 - val_loss: 0.5647 - val_output_1_loss: 0.5078 - val_output_2_loss: 1.0775\n",
      "Epoch 10/10\n",
      "363/363 [==============================] - 0s 948us/step - loss: 0.5855 - output_1_loss: 0.5249 - output_2_loss: 1.1308 - val_loss: 0.5563 - val_output_1_loss: 0.5011 - val_output_2_loss: 1.0529\n",
      "162/162 [==============================] - 0s 645us/step - loss: 0.5720 - output_1_loss: 0.5092 - output_2_loss: 1.1375\n",
      "WARNING:tensorflow:6 out of the last 7 calls to <function Model.make_predict_function.<locals>.predict_function at 0x000002B68254DA60> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.\n"
     ]
    }
   ],
   "source": [
    "model.compile(loss=\"mse\", loss_weights=[0.9, 0.1], optimizer=keras.optimizers.SGD(learning_rate=1e-3))\n",
    "history = model.fit((x_train_A, x_train_B), (y_train, y_train), epochs=10,\n",
    "                    validation_data=((x_valid_A, x_valid_B), (y_valid, y_valid)))\n",
    "total_loss, main_loss, aux_loss = model.evaluate((x_test_A, x_test_B), (y_test, y_test))\n",
    "y_pred_main, y_pred_aux = model.predict((x_new_A, x_new_B))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a16db124-903f-4f4d-8892-4c81c23d744d",
   "metadata": {},
   "source": [
    "# 保存和还原模型"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e84f8391-3bdd-4405-859f-f26109c63682",
   "metadata": {},
   "source": [
    "```\n",
    "model.save('my_keras_model.h5')  # 保存\n",
    "\n",
    "model = kareas.models.load_model('my_seras_model.h5')  # 读取\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "643da4a8-296c-4580-abbf-2add66a568fb",
   "metadata": {},
   "source": [
    "# 回调函数（断点续传）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8d6d0b1-a3f7-4169-ba28-1428947066ce",
   "metadata": {},
   "source": [
    "## 定期保存"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "bf76a6f7-c6a0-4ef5-a53d-4d9f2bceadc5",
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "a7dab646-620a-4671-a6be-fa430e420123",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.models.Sequential([\n",
    "    keras.layers.Dense(30, activation=\"relu\", input_shape=[8]),\n",
    "    keras.layers.Dense(30, activation=\"relu\"),\n",
    "    keras.layers.Dense(1)\n",
    "])\n",
    "model.compile(loss=\"mse\", optimizer=keras.optimizers.SGD(learning_rate=1e-3))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "95f95a83-d31b-41fc-a808-d6f3f299ade2",
   "metadata": {},
   "outputs": [],
   "source": [
    "checkpoint_cb = keras.callbacks.ModelCheckpoint(r\"model/my_keras_model.h5\", save_best_only=True)\n",
    "# 保存最佳模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "0ee58df1-b69b-485f-8003-712f5eded5d0",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "363/363 [==============================] - 1s 1ms/step - loss: 2.2958 - val_loss: 1.0936\n",
      "Epoch 2/10\n",
      "363/363 [==============================] - 0s 884us/step - loss: 0.9789 - val_loss: 0.8937\n",
      "Epoch 3/10\n",
      "363/363 [==============================] - 0s 838us/step - loss: 0.7115 - val_loss: 0.6168\n",
      "Epoch 4/10\n",
      "363/363 [==============================] - 0s 824us/step - loss: 0.6370 - val_loss: 0.5808\n",
      "Epoch 5/10\n",
      "363/363 [==============================] - 0s 973us/step - loss: 0.6069 - val_loss: 0.5611\n",
      "Epoch 6/10\n",
      "363/363 [==============================] - 0s 970us/step - loss: 0.5844 - val_loss: 0.5427\n",
      "Epoch 7/10\n",
      "363/363 [==============================] - 0s 926us/step - loss: 0.5666 - val_loss: 0.5280\n",
      "Epoch 8/10\n",
      "363/363 [==============================] - 0s 827us/step - loss: 0.5521 - val_loss: 0.5166\n",
      "Epoch 9/10\n",
      "363/363 [==============================] - 0s 799us/step - loss: 0.5404 - val_loss: 0.5066\n",
      "Epoch 10/10\n",
      "363/363 [==============================] - 0s 810us/step - loss: 0.5298 - val_loss: 0.4990\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train, y_train, epochs=10,\n",
    "                    validation_data=(x_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "85aa8fec-f3e7-4afe-8f7c-2744919252a3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "162/162 [==============================] - 0s 527us/step - loss: 0.5046\n"
     ]
    }
   ],
   "source": [
    "model = keras.models.load_model(r\"model/my_keras_model.h5\") # 取得最佳模型\n",
    "mse_test = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "59e6ff39-783f-4ca6-8d48-0ea9f2a4edbd",
   "metadata": {},
   "source": [
    "## 提前停止"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f9ba24ca-4519-45fc-bbc7-65ce94ab7f15",
   "metadata": {},
   "source": [
    "在`patience`轮验证集上的效果无明显进展时，停止训练，自动保存最佳模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "51d332a9-7ab1-42b9-b4a0-07b877cf423b",
   "metadata": {},
   "outputs": [],
   "source": [
    "early_stopping_cb = keras.callbacks.EarlyStopping(patience=10,\n",
    "                                                  restore_best_weights=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "636c892b-58e8-4b4d-8897-90a426269fbd",
   "metadata": {},
   "source": [
    "## 合并使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "e0ab00eb-bc76-4e70-b085-0ec16817557f",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "363/363 [==============================] - 0s 846us/step - loss: 0.5209 - val_loss: 0.4916\n",
      "Epoch 2/10\n",
      "363/363 [==============================] - 0s 846us/step - loss: 0.5132 - val_loss: 0.4838\n",
      "Epoch 3/10\n",
      "363/363 [==============================] - 0s 873us/step - loss: 0.5066 - val_loss: 0.4795\n",
      "Epoch 4/10\n",
      "363/363 [==============================] - 0s 862us/step - loss: 0.5004 - val_loss: 0.4728\n",
      "Epoch 5/10\n",
      "363/363 [==============================] - 0s 843us/step - loss: 0.4949 - val_loss: 0.4694\n",
      "Epoch 6/10\n",
      "363/363 [==============================] - 0s 824us/step - loss: 0.4898 - val_loss: 0.4648\n",
      "Epoch 7/10\n",
      "363/363 [==============================] - 0s 824us/step - loss: 0.4852 - val_loss: 0.4596\n",
      "Epoch 8/10\n",
      "363/363 [==============================] - 0s 832us/step - loss: 0.4812 - val_loss: 0.4566\n",
      "Epoch 9/10\n",
      "363/363 [==============================] - 0s 815us/step - loss: 0.4777 - val_loss: 0.4527\n",
      "Epoch 10/10\n",
      "363/363 [==============================] - 0s 794us/step - loss: 0.4740 - val_loss: 0.4508\n",
      "162/162 [==============================] - 0s 527us/step - loss: 0.4562\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(x_train, y_train, epochs=10,  # 在大型数据集可以设置较高的轮次，如1000\n",
    "                    validation_data=(x_valid, y_valid),\n",
    "                    callbacks=[checkpoint_cb, early_stopping_cb])  # 合并\n",
    "mse_test = model.evaluate(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32ea84f8-ddca-4335-9ecd-7a6c665795d8",
   "metadata": {},
   "source": [
    "# 自定义回调函数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "78a66a62-c7a4-42d7-a569-fb078bfeed3b",
   "metadata": {},
   "source": [
    "自定义额外的控制，比如每轮训练返回验证集和训练集损失比率，用于观察拟合情况"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "149e02c9-f3d8-4932-a692-8ed7ddddf8ed",
   "metadata": {},
   "outputs": [],
   "source": [
    "class PrintValTrainRatioCallback(keras.callbacks.Callback):\n",
    "    def on_epoch_end(self, epoch, logs):\n",
    "        print(\"\\nval/train: {:.2f}\".format(logs[\"val_loss\"] / logs[\"loss\"]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "40946c71-add8-4b67-8e77-761e2340ccb4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/2\n",
      "332/363 [==========================>...] - ETA: 0s - loss: 0.4643\n",
      "val/train: 0.95\n",
      "363/363 [==============================] - 0s 849us/step - loss: 0.4708 - val_loss: 0.4479\n",
      "Epoch 2/2\n",
      "308/363 [========================>.....] - ETA: 0s - loss: 0.4734\n",
      "val/train: 0.95\n",
      "363/363 [==============================] - 0s 824us/step - loss: 0.4678 - val_loss: 0.4441\n"
     ]
    }
   ],
   "source": [
    "val_train_ratio_cb = PrintValTrainRatioCallback()\n",
    "history = model.fit(x_train, y_train, epochs=2,\n",
    "                    validation_data=(x_valid, y_valid),\n",
    "                    callbacks=[val_train_ratio_cb])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0444f66c-bc46-4909-b49b-81763a765bb9",
   "metadata": {},
   "source": [
    "# TensorBoard可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "59e784f3-bdfd-4147-9a51-49e8f358977b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os   \n",
    "root_logdir = os.path.join(os.curdir, 'my_logs')  # 相对路径\n",
    "\n",
    "def get_run_logdir():\n",
    "    import time\n",
    "    run_id = time.strftime('run_%Y_%m_%d-%H_%M_%S')  # 返回本地时间\n",
    "    return os.path.join(root_logdir, run_id)\n",
    "run_logdir = get_run_logdir()  # 取得当前时间命名的摘要文件位置"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "579bd5a1-eeae-4f62-b6d3-fbd17ec9def9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'.\\\\my_logs\\\\run_2022_02_10-12_08_10'"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "run_logdir"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "f3d8ad35-85a6-4ef9-a7cd-4a440f699c1c",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "scrolled": true,
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "363/363 [==============================] - 0s 956us/step - loss: 0.4422 - val_loss: 0.4227\n",
      "Epoch 2/20\n",
      "363/363 [==============================] - 0s 923us/step - loss: 0.4408 - val_loss: 0.4203\n",
      "Epoch 3/20\n",
      "363/363 [==============================] - 0s 939us/step - loss: 0.4398 - val_loss: 0.4204\n",
      "Epoch 4/20\n",
      "363/363 [==============================] - 0s 959us/step - loss: 0.4384 - val_loss: 0.4179\n",
      "Epoch 5/20\n",
      "363/363 [==============================] - 0s 984us/step - loss: 0.4373 - val_loss: 0.4178\n",
      "Epoch 6/20\n",
      "363/363 [==============================] - 0s 888us/step - loss: 0.4360 - val_loss: 0.4167\n",
      "Epoch 7/20\n",
      "363/363 [==============================] - 0s 857us/step - loss: 0.4348 - val_loss: 0.4148\n",
      "Epoch 8/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.4339 - val_loss: 0.4147\n",
      "Epoch 9/20\n",
      "363/363 [==============================] - 0s 992us/step - loss: 0.4330 - val_loss: 0.4127\n",
      "Epoch 10/20\n",
      "363/363 [==============================] - 0s 962us/step - loss: 0.4315 - val_loss: 0.4133\n",
      "Epoch 11/20\n",
      "363/363 [==============================] - 0s 978us/step - loss: 0.4304 - val_loss: 0.4108\n",
      "Epoch 12/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.4294 - val_loss: 0.4108\n",
      "Epoch 13/20\n",
      "363/363 [==============================] - 0s 970us/step - loss: 0.4286 - val_loss: 0.4105\n",
      "Epoch 14/20\n",
      "363/363 [==============================] - 0s 981us/step - loss: 0.4278 - val_loss: 0.4085\n",
      "Epoch 15/20\n",
      "363/363 [==============================] - 0s 939us/step - loss: 0.4264 - val_loss: 0.4076\n",
      "Epoch 16/20\n",
      "363/363 [==============================] - 0s 1ms/step - loss: 0.4256 - val_loss: 0.4074\n",
      "Epoch 17/20\n",
      "363/363 [==============================] - 0s 995us/step - loss: 0.4249 - val_loss: 0.4059\n",
      "Epoch 18/20\n",
      "363/363 [==============================] - 0s 953us/step - loss: 0.4234 - val_loss: 0.4041\n",
      "Epoch 19/20\n",
      "363/363 [==============================] - 0s 959us/step - loss: 0.4226 - val_loss: 0.4046\n",
      "Epoch 20/20\n",
      "363/363 [==============================] - 0s 978us/step - loss: 0.4217 - val_loss: 0.4032\n"
     ]
    }
   ],
   "source": [
    "tensorboard_cb = keras.callbacks.TensorBoard(run_logdir)  # 传入文件名（路径）即可\n",
    "history = model.fit(x_train, y_train, epochs=20,\n",
    "                    validation_data=(x_valid, y_valid),\n",
    "                    callbacks=[tensorboard_cb, checkpoint_cb])  \n",
    "# 回调参数引用定义的tensorboard_cb和保存最佳模型的checkpoint_cb"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bbaa1e38-bb68-47e1-a4ec-00d0648c4579",
   "metadata": {},
   "source": [
    "在prompt终端输入命令：\n",
    "`tensorboard --logdir=./my_logs --port=6006`\n",
    "打开`tensorboard`\n",
    "\n",
    "注意路径，必须带有路径"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc96b4da-440f-4e30-89ba-72f0316d226f",
   "metadata": {},
   "source": [
    "# 微调神经网络超参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "d5b81b9e-a335-4a19-b47e-cc601248c8b4",
   "metadata": {},
   "outputs": [],
   "source": [
    "keras.backend.clear_session()\n",
    "np.random.seed(42)\n",
    "tf.random.set_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "c1df5057-7635-4235-8c80-7badd3ae0d4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 创建一个函数用于根据参数生成并编译模型\n",
    "def build_model(n_hidden=1, n_neurons=30, learning_rate=3e-3, input_shape=[8]):\n",
    "    model = keras.models.Sequential()\n",
    "    model.add(keras.layers.InputLayer(input_shape=input_shape))  # 添加输入层\n",
    "    for layer in range(n_hidden):\n",
    "        model.add(keras.layers.Dense(n_neurons, activation=\"relu\"))  # 添加隐藏层\n",
    "    model.add(keras.layers.Dense(1))\n",
    "    optimizer = keras.optimizers.SGD(learning_rate=learning_rate)  # 优化器\n",
    "    model.compile(loss=\"mse\", optimizer=optimizer)  # 编译\n",
    "    return model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "b2c99033-97df-49f3-b318-d4952037843f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(11610, 8)"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9e2ddcfb-9c3c-4c50-9cd1-b118ff481c18",
   "metadata": {},
   "source": [
    "## 模仿sklearn包装模型\n",
    "\n",
    "包装之后可以类似`sklearn`调用`fit`，`score`和`predict`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 255,
   "id": "464fd5d8-a0dd-426c-83af-84cabc599eb0",
   "metadata": {},
   "outputs": [],
   "source": [
    "from scikeras.wrappers import KerasRegressor  # KerasClassifier()从tf.keras独立出来了\n",
    "keras_reg = KerasRegressor(build_model, n_neurons=1, n_hidden=1, learning_rate=0.01)  # 包装\n",
    "# 定义KerasRegressor()实例时必须初始化必要的参数，否则网格搜索报错"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 256,
   "id": "2c34166e-3f5b-4fbf-a171-bb4eb84ba320",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/10\n",
      "363/363 [==============================] - 1s 989us/step - loss: 1.3900 - val_loss: 0.7544\n",
      "Epoch 2/10\n",
      "363/363 [==============================] - 0s 835us/step - loss: 0.7023 - val_loss: 0.6037\n",
      "Epoch 3/10\n",
      "363/363 [==============================] - 0s 763us/step - loss: 0.6110 - val_loss: 0.5508\n",
      "Epoch 4/10\n",
      "363/363 [==============================] - 0s 782us/step - loss: 0.5577 - val_loss: 0.5071\n",
      "Epoch 5/10\n",
      "363/363 [==============================] - 0s 785us/step - loss: 0.5239 - val_loss: 0.4865\n",
      "Epoch 6/10\n",
      "363/363 [==============================] - 0s 860us/step - loss: 0.5048 - val_loss: 0.4707\n",
      "Epoch 7/10\n",
      "363/363 [==============================] - 0s 766us/step - loss: 0.5031 - val_loss: 0.4916\n",
      "Epoch 8/10\n",
      "363/363 [==============================] - 0s 774us/step - loss: 0.5060 - val_loss: 0.4695\n",
      "Epoch 9/10\n",
      "363/363 [==============================] - 0s 780us/step - loss: 0.4909 - val_loss: 0.4621\n",
      "Epoch 10/10\n",
      "363/363 [==============================] - 0s 722us/step - loss: 0.4926 - val_loss: 0.5285\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "KerasRegressor(\n",
       "\tmodel=<function build_model at 0x000002B68704B670>\n",
       "\tbuild_fn=None\n",
       "\twarm_start=False\n",
       "\trandom_state=None\n",
       "\toptimizer=rmsprop\n",
       "\tloss=None\n",
       "\tmetrics=None\n",
       "\tbatch_size=None\n",
       "\tvalidation_batch_size=None\n",
       "\tverbose=1\n",
       "\tcallbacks=None\n",
       "\tvalidation_split=0.0\n",
       "\tshuffle=True\n",
       "\trun_eagerly=False\n",
       "\tepochs=1\n",
       "\tn_neurons=1\n",
       "\tn_hidden=1\n",
       "\tlearning_rate=0.01\n",
       ")"
      ]
     },
     "execution_count": 256,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 包装完毕后可以调用类似sklearn的方法，如fit, score, predict\n",
    "keras_reg.fit(x_train, y_train, epochs=10,\n",
    "              validation_data=(x_valid, y_valid),\n",
    "              callbacks=[keras.callbacks.EarlyStopping(patience=10)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 257,
   "id": "fb716662-b5d5-42fc-9623-3ac77519f830",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "162/162 [==============================] - 0s 514us/step\n",
      "1/1 [==============================] - 0s 12ms/step\n"
     ]
    }
   ],
   "source": [
    "mse_test = keras_reg.score(x_test, y_test)\n",
    "y_pred = keras_reg.predict(x_new)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 258,
   "id": "9811600a-a409-41ee-b883-ac9912549b0f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6075695222166689"
      ]
     },
     "execution_count": 258,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mse_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 259,
   "id": "dc32bc02-3618-4f95-ba7b-240c78293345",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1.1503806 , 4.263288  , 0.96167964], dtype=float32)"
      ]
     },
     "execution_count": 259,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_pred"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecf63f13-3d62-458a-880e-ab5b71d52cc6",
   "metadata": {},
   "source": [
    "## 网格搜索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 272,
   "id": "1fc9c9c5-802c-495e-aa61-28a0dbc4b9eb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([531., 132.,  79.,  57.,  40.,  48.,  26.,  29.,  26.,  32.]),\n",
       " array([0.00030025, 0.00325421, 0.00620817, 0.00916213, 0.01211609,\n",
       "        0.01507005, 0.01802402, 0.02097798, 0.02393194, 0.0268859 ,\n",
       "        0.02983986]),\n",
       " <BarContainer object of 10 artists>)"
      ]
     },
     "execution_count": 272,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 参数比较多，采用随机网格搜索\n",
    "from scipy.stats import reciprocal  # 生成指定区间内的（倒数/反比例）随机变量\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "plt.hist(reciprocal(3e-4, 3e-2).rvs(1000))  # 反比例函数形式，仅用于展示reciprocal用途"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 261,
   "id": "5a226795-9045-40e4-b4b1-c2738ed88ffe",
   "metadata": {},
   "outputs": [],
   "source": [
    "param_distribs = {\n",
    "    \"n_hidden\": [0, 1, 2],\n",
    "    \"n_neurons\": np.arange(1, 5).tolist(),\n",
    "    \"learning_rate\": reciprocal(3e-4, 3e-2).rvs(5).tolist(),\n",
    "}\n",
    "\n",
    "rnd_search_cv = RandomizedSearchCV(keras_reg, param_distribs, n_iter=10, cv=3, verbose=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 262,
   "id": "44c5d333-39f2-4c4e-a083-82ce5911c3ce",
   "metadata": {
    "collapsed": true,
    "jupyter": {
     "outputs_hidden": true
    },
    "tags": []
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 3 folds for each of 10 candidates, totalling 30 fits\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 6.7010 - val_loss: 4.7335\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 832us/step - loss: 4.2953 - val_loss: 3.2142\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 844us/step - loss: 2.9315 - val_loss: 2.2965\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 973us/step - loss: 2.1188 - val_loss: 1.7214\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 1.6149 - val_loss: 1.3502\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 935us/step - loss: 1.2922 - val_loss: 1.1061\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.0804 - val_loss: 0.9427\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.9391 - val_loss: 0.8325\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 939us/step - loss: 0.8434 - val_loss: 0.7572\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 977us/step - loss: 0.7779 - val_loss: 0.7054\n",
      "121/121 [==============================] - 0s 598us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=0, n_neurons=4; total time=   2.5s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 6.7502 - val_loss: 5.4140\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 956us/step - loss: 4.7685 - val_loss: 3.8802\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 973us/step - loss: 3.4751 - val_loss: 2.8687\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 923us/step - loss: 2.6188 - val_loss: 2.1946\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 877us/step - loss: 2.0452 - val_loss: 1.7399\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 939us/step - loss: 1.6566 - val_loss: 1.4310\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.3911 - val_loss: 1.2195\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 981us/step - loss: 1.2083 - val_loss: 1.0742\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 935us/step - loss: 1.0810 - val_loss: 0.9728\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 964us/step - loss: 0.9916 - val_loss: 0.9020\n",
      "121/121 [==============================] - 0s 474us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=0, n_neurons=4; total time=   2.6s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 6.3501 - val_loss: 5.2614\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 915us/step - loss: 4.3696 - val_loss: 3.7401\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 869us/step - loss: 3.1344 - val_loss: 2.7743\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 910us/step - loss: 2.3473 - val_loss: 2.1457\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.8351 - val_loss: 1.7285\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 960us/step - loss: 1.4962 - val_loss: 1.4466\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 848us/step - loss: 1.2682 - val_loss: 1.2521\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 886us/step - loss: 1.1124 - val_loss: 1.1159\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 902us/step - loss: 1.0043 - val_loss: 1.0184\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.9282 - val_loss: 0.9474\n",
      "121/121 [==============================] - 0s 515us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=0, n_neurons=4; total time=   2.5s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.8217 - val_loss: 1.9299\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.5201 - val_loss: 1.1518\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 981us/step - loss: 1.0511 - val_loss: 0.8754\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - ETA: 0s - loss: 0.846 - 0s 956us/step - loss: 0.8466 - val_loss: 0.7449\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.7499 - val_loss: 0.6903\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 977us/step - loss: 0.7094 - val_loss: 0.6667\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 985us/step - loss: 0.6900 - val_loss: 0.6544\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 993us/step - loss: 0.6786 - val_loss: 0.6446\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 989us/step - loss: 0.6698 - val_loss: 0.6364\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.6615 - val_loss: 0.6286\n",
      "121/121 [==============================] - 1s 515us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=1, n_neurons=2; total time=   3.4s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.1742 - val_loss: 2.0738\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.7681 - val_loss: 1.4211\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.2817 - val_loss: 1.0614\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.9564 - val_loss: 0.7952\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 935us/step - loss: 0.7430 - val_loss: 0.6390\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 0.6328 - val_loss: 0.5767\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 0.5890 - val_loss: 0.5504\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 0.5657 - val_loss: 0.5329\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.5506 - val_loss: 0.5204\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 0.5403 - val_loss: 0.5122\n",
      "121/121 [==============================] - 0s 449us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=1, n_neurons=2; total time=   2.6s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.5491 - val_loss: 2.1342\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 820us/step - loss: 1.8842 - val_loss: 1.5453\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 828us/step - loss: 1.5036 - val_loss: 1.3183\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 1.3443 - val_loss: 1.2191\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 811us/step - loss: 1.2691 - val_loss: 1.1677\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 1.2231 - val_loss: 1.1297\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.1850 - val_loss: 1.0926\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.1477 - val_loss: 1.0549\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 1.1091 - val_loss: 1.0167\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 1.0693 - val_loss: 0.9796\n",
      "121/121 [==============================] - 0s 475us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=1, n_neurons=2; total time=   2.2s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.0367 - val_loss: 3.2808\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 2.9419 - val_loss: 2.4546\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 2.2777 - val_loss: 1.9211\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.8157 - val_loss: 1.5259\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 786us/step - loss: 1.4572 - val_loss: 1.2137\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 811us/step - loss: 1.1732 - val_loss: 0.9733\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 877us/step - loss: 0.9576 - val_loss: 0.8040\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 940us/step - loss: 0.8111 - val_loss: 0.6970\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 811us/step - loss: 0.7194 - val_loss: 0.6330\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 0.6647 - val_loss: 0.5968\n",
      "121/121 [==============================] - 0s 457us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=1, n_neurons=2; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.3202 - val_loss: 3.3386\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 3.0457 - val_loss: 2.5324\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 782us/step - loss: 2.3833 - val_loss: 2.0578\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 757us/step - loss: 1.9696 - val_loss: 1.7320\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 1.6750 - val_loss: 1.4888\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 869us/step - loss: 1.4547 - val_loss: 1.3052\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 931us/step - loss: 1.2894 - val_loss: 1.1676\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 869us/step - loss: 1.1669 - val_loss: 1.0681\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.0783 - val_loss: 0.9996\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.0168 - val_loss: 0.9529\n",
      "121/121 [==============================] - 0s 474us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=1, n_neurons=2; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.6912 - val_loss: 3.2321\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 2.7278 - val_loss: 2.0453\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 1.7947 - val_loss: 1.4206\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.2914 - val_loss: 1.0866\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.0219 - val_loss: 0.9062\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 753us/step - loss: 0.8760 - val_loss: 0.8044\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 770us/step - loss: 0.7918 - val_loss: 0.7382\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 0.7378 - val_loss: 0.6929\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 770us/step - loss: 0.7000 - val_loss: 0.6590\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 0.6721 - val_loss: 0.6327\n",
      "121/121 [==============================] - 0s 449us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=1, n_neurons=2; total time=   2.2s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 2.6743 - val_loss: 1.4666\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.3960 - val_loss: 1.2789\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 1.3344 - val_loss: 1.2704\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 1.3312 - val_loss: 1.2703\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 790us/step - loss: 1.3312 - val_loss: 1.2703\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 1.3312 - val_loss: 1.2703\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.3310 - val_loss: 1.2706\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.3311 - val_loss: 1.2704\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 1.3311 - val_loss: 1.2704\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 820us/step - loss: 1.3311 - val_loss: 1.2704\n",
      "121/121 [==============================] - 0s 482us/step\n",
      "[CV] END learning_rate=0.003097032220712561, n_hidden=2, n_neurons=1; total time=   2.2s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 2.6803 - val_loss: 1.4739\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.4020 - val_loss: 1.2789\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 787us/step - loss: 1.3381 - val_loss: 1.2703\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.3352 - val_loss: 1.2703\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 956us/step - loss: 1.3352 - val_loss: 1.2703\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 939us/step - loss: 1.3352 - val_loss: 1.2704\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 790us/step - loss: 1.3352 - val_loss: 1.2704\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.3352 - val_loss: 1.2704\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 1.3352 - val_loss: 1.2703\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 786us/step - loss: 1.3352 - val_loss: 1.2704\n",
      "121/121 [==============================] - 0s 482us/step\n",
      "[CV] END learning_rate=0.003097032220712561, n_hidden=2, n_neurons=1; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 2.7474 - val_loss: 1.4580\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 761us/step - loss: 1.4269 - val_loss: 1.2826\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 782us/step - loss: 1.3617 - val_loss: 1.2710\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.3543 - val_loss: 1.2673\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 762us/step - loss: 1.3510 - val_loss: 1.2647\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 828us/step - loss: 1.3477 - val_loss: 1.2618\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.3436 - val_loss: 1.2571\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.3376 - val_loss: 1.2504\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 1.3278 - val_loss: 1.2392\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 1.3134 - val_loss: 1.2234\n",
      "121/121 [==============================] - 0s 507us/step\n",
      "[CV] END learning_rate=0.003097032220712561, n_hidden=2, n_neurons=1; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 2.4006 - val_loss: 1.1474\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 1.0358 - val_loss: 0.8395\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 861us/step - loss: 0.8130 - val_loss: 0.7149\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 790us/step - loss: 0.7169 - val_loss: 0.6465\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 969us/step - loss: 0.6606 - val_loss: 0.6072\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 977us/step - loss: 0.6278 - val_loss: 0.5816\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 857us/step - loss: 0.6025 - val_loss: 0.5624\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 0.5833 - val_loss: 0.5425\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 820us/step - loss: 0.5662 - val_loss: 0.5267\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 911us/step - loss: 0.5505 - val_loss: 0.5135\n",
      "121/121 [==============================] - 0s 524us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=2, n_neurons=3; total time=   2.4s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 2.4321 - val_loss: 1.3193\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 1.3547 - val_loss: 1.0806\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 886us/step - loss: 0.9487 - val_loss: 0.8229\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.8109 - val_loss: 0.7378\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 840us/step - loss: 0.7415 - val_loss: 0.6961\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 819us/step - loss: 0.7046 - val_loss: 0.6682\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 906us/step - loss: 0.6782 - val_loss: 0.6466\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 0.6558 - val_loss: 0.6270\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 832us/step - loss: 0.6346 - val_loss: 0.6048\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.6085 - val_loss: 0.5778\n",
      "121/121 [==============================] - 0s 507us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=2, n_neurons=3; total time=   2.5s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.3215 - val_loss: 1.8524\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 1.6147 - val_loss: 1.3408\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 882us/step - loss: 1.3680 - val_loss: 1.2576\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 969us/step - loss: 1.3026 - val_loss: 1.2173\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 985us/step - loss: 1.2603 - val_loss: 1.1836\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 981us/step - loss: 1.2234 - val_loss: 1.1475\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - ETA: 0s - loss: 1.184 - 0s 981us/step - loss: 1.1825 - val_loss: 1.1055\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 989us/step - loss: 1.1330 - val_loss: 1.0512\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 1.0672 - val_loss: 0.9773\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.9775 - val_loss: 0.8829\n",
      "121/121 [==============================] - 0s 549us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=2, n_neurons=3; total time=   2.6s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 7.0452 - val_loss: 4.7714\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 4.5591 - val_loss: 3.2975\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 3.1165 - val_loss: 2.3694\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 745us/step - loss: 2.2378 - val_loss: 1.7704\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 894us/step - loss: 1.6855 - val_loss: 1.3754\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 757us/step - loss: 1.3284 - val_loss: 1.1124\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 790us/step - loss: 1.0928 - val_loss: 0.9356\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 869us/step - loss: 0.9361 - val_loss: 0.8164\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 766us/step - loss: 0.8304 - val_loss: 0.7354\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 745us/step - loss: 0.7585 - val_loss: 0.6801\n",
      "121/121 [==============================] - 0s 416us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=0, n_neurons=3; total time=   2.2s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 5.6313 - val_loss: 4.7460\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 741us/step - loss: 4.1206 - val_loss: 3.4899\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 741us/step - loss: 3.0793 - val_loss: 2.6235\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 758us/step - loss: 2.3598 - val_loss: 2.0254\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 741us/step - loss: 1.8606 - val_loss: 1.6104\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.5129 - val_loss: 1.3222\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 869us/step - loss: 1.2700 - val_loss: 1.1213\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 1.0996 - val_loss: 0.9813\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 757us/step - loss: 0.9792 - val_loss: 0.8826\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 0.8938 - val_loss: 0.8132\n",
      "121/121 [==============================] - 0s 424us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=0, n_neurons=3; total time=   2.1s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 6.8959 - val_loss: 5.8432\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 782us/step - loss: 4.9460 - val_loss: 4.2339\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 733us/step - loss: 3.6191 - val_loss: 3.1353\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 766us/step - loss: 2.7120 - val_loss: 2.3820\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 2.0890 - val_loss: 1.8632\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 737us/step - loss: 1.6596 - val_loss: 1.5045\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 757us/step - loss: 1.3621 - val_loss: 1.2546\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 766us/step - loss: 1.1546 - val_loss: 1.0792\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 757us/step - loss: 1.0090 - val_loss: 0.9553\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 749us/step - loss: 0.9060 - val_loss: 0.8669\n",
      "121/121 [==============================] - 0s 507us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=0, n_neurons=3; total time=   2.1s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.8892 - val_loss: 2.5163\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 857us/step - loss: 2.1469 - val_loss: 1.5099\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 832us/step - loss: 1.3407 - val_loss: 1.0019\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 849us/step - loss: 1.0389 - val_loss: 0.8372\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 820us/step - loss: 0.8841 - val_loss: 0.7429\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 865us/step - loss: 0.7953 - val_loss: 0.6832\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 0.7391 - val_loss: 0.6469\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 0.7005 - val_loss: 0.6193\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 0.6729 - val_loss: 0.6011\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 832us/step - loss: 0.6521 - val_loss: 0.5871\n",
      "121/121 [==============================] - 0s 474us/step\n",
      "[CV] END learning_rate=0.0006344564654937622, n_hidden=2, n_neurons=2; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.4889 - val_loss: 2.9393\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 857us/step - loss: 2.2663 - val_loss: 1.6527\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 1.4632 - val_loss: 1.2497\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 873us/step - loss: 1.2388 - val_loss: 1.1401\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 998us/step - loss: 1.1633 - val_loss: 1.0840\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 1.1113 - val_loss: 1.0349\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 857us/step - loss: 1.0621 - val_loss: 0.9859\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 865us/step - loss: 1.0117 - val_loss: 0.9373\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 894us/step - loss: 0.9625 - val_loss: 0.8916\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 861us/step - loss: 0.9167 - val_loss: 0.8511\n",
      "121/121 [==============================] - 0s 491us/step\n",
      "[CV] END learning_rate=0.0006344564654937622, n_hidden=2, n_neurons=2; total time=   2.5s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 2.1478 - val_loss: 1.5430\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 853us/step - loss: 1.3920 - val_loss: 1.2164\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 840us/step - loss: 1.1485 - val_loss: 1.0390\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 1.0112 - val_loss: 0.9352\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 819us/step - loss: 0.9296 - val_loss: 0.8706\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 848us/step - loss: 0.8759 - val_loss: 0.8251\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 811us/step - loss: 0.8399 - val_loss: 0.7944\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.8118 - val_loss: 0.7693\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 849us/step - loss: 0.7894 - val_loss: 0.7492\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 811us/step - loss: 0.7707 - val_loss: 0.7325\n",
      "121/121 [==============================] - 0s 491us/step\n",
      "[CV] END learning_rate=0.0006344564654937622, n_hidden=2, n_neurons=2; total time=   2.4s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.9598 - val_loss: 4.1493\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 853us/step - loss: 3.6978 - val_loss: 3.1400\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 865us/step - loss: 2.8620 - val_loss: 2.4618\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 910us/step - loss: 2.2980 - val_loss: 2.0013\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 881us/step - loss: 1.9147 - val_loss: 1.6860\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 906us/step - loss: 1.6506 - val_loss: 1.4656\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 906us/step - loss: 1.4651 - val_loss: 1.3092\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 902us/step - loss: 1.3303 - val_loss: 1.1937\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 902us/step - loss: 1.2268 - val_loss: 1.1032\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 840us/step - loss: 1.1430 - val_loss: 1.0290\n",
      "121/121 [==============================] - 0s 540us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=1, n_neurons=1; total time=   2.5s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 5.0568 - val_loss: 3.9747\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 861us/step - loss: 3.8242 - val_loss: 3.4010\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 3.2834 - val_loss: 2.9684\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 2.8859 - val_loss: 2.6264\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 757us/step - loss: 2.5734 - val_loss: 2.3476\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 2.3169 - val_loss: 2.1135\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 2.0979 - val_loss: 1.9082\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 865us/step - loss: 1.9039 - val_loss: 1.7232\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.7158 - val_loss: 1.5213\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 791us/step - loss: 1.5071 - val_loss: 1.3046\n",
      "121/121 [==============================] - 0s 507us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=1, n_neurons=1; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.1742 - val_loss: 3.5652\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 840us/step - loss: 3.3730 - val_loss: 2.9147\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 761us/step - loss: 2.7344 - val_loss: 2.3521\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 832us/step - loss: 2.1781 - val_loss: 1.8523\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 828us/step - loss: 1.7191 - val_loss: 1.4619\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 819us/step - loss: 1.3773 - val_loss: 1.1664\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.1096 - val_loss: 0.9273\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 0.8843 - val_loss: 0.7340\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 828us/step - loss: 0.7279 - val_loss: 0.6262\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 844us/step - loss: 0.6479 - val_loss: 0.5755\n",
      "121/121 [==============================] - 0s 499us/step\n",
      "[CV] END learning_rate=0.0003885626779073971, n_hidden=1, n_neurons=1; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.6070 - val_loss: 1.7908\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 819us/step - loss: 1.3055 - val_loss: 0.9116\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 753us/step - loss: 0.8476 - val_loss: 0.7192\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 741us/step - loss: 0.7335 - val_loss: 0.6664\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 811us/step - loss: 0.6905 - val_loss: 0.6396\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 915us/step - loss: 0.6668 - val_loss: 0.6216\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 898us/step - loss: 0.6498 - val_loss: 0.6077\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 0.6349 - val_loss: 0.5955\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 910us/step - loss: 0.6223 - val_loss: 0.5841\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 844us/step - loss: 0.6118 - val_loss: 0.5749\n",
      "121/121 [==============================] - 0s 416us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=0, n_neurons=3; total time=   2.4s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.6386 - val_loss: 2.0252\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 766us/step - loss: 1.4417 - val_loss: 0.9860\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 782us/step - loss: 0.8914 - val_loss: 0.7506\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 745us/step - loss: 0.7532 - val_loss: 0.6856\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 741us/step - loss: 0.7030 - val_loss: 0.6561\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 753us/step - loss: 0.6754 - val_loss: 0.6351\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 0.6573 - val_loss: 0.6207\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 741us/step - loss: 0.6410 - val_loss: 0.6061\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 745us/step - loss: 0.6276 - val_loss: 0.5939\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 848us/step - loss: 0.6171 - val_loss: 0.5839\n",
      "121/121 [==============================] - 0s 449us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=0, n_neurons=3; total time=   2.1s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 4.0954 - val_loss: 1.8985\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 1.2144 - val_loss: 0.9222\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 0.7470 - val_loss: 0.7077\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 0.6441 - val_loss: 0.6366\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 762us/step - loss: 0.6117 - val_loss: 0.5999\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 956us/step - loss: 0.5958 - val_loss: 0.5763\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 782us/step - loss: 0.5855 - val_loss: 0.5598\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 0.5778 - val_loss: 0.5479\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 749us/step - loss: 0.5718 - val_loss: 0.5391\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 0.5670 - val_loss: 0.5326\n",
      "121/121 [==============================] - 0s 449us/step\n",
      "[CV] END learning_rate=0.0017385239188414362, n_hidden=0, n_neurons=3; total time=   2.2s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.7554 - val_loss: 2.4390\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 2.0345 - val_loss: 1.4122\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 869us/step - loss: 1.2229 - val_loss: 0.9016\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 819us/step - loss: 0.8433 - val_loss: 0.6794\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 0.6807 - val_loss: 0.5931\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 807us/step - loss: 0.6180 - val_loss: 0.5570\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 786us/step - loss: 0.5883 - val_loss: 0.5390\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 782us/step - loss: 0.5722 - val_loss: 0.5280\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 836us/step - loss: 0.5624 - val_loss: 0.5208\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 0.5556 - val_loss: 0.5161\n",
      "121/121 [==============================] - 0s 465us/step\n",
      "[CV] END learning_rate=0.0006344564654937622, n_hidden=1, n_neurons=3; total time=   2.3s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 3.2608 - val_loss: 2.4360\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 766us/step - loss: 2.2587 - val_loss: 1.8071\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 790us/step - loss: 1.7259 - val_loss: 1.4404\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 778us/step - loss: 1.4186 - val_loss: 1.2180\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 786us/step - loss: 1.2023 - val_loss: 1.0573\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 774us/step - loss: 1.0494 - val_loss: 0.9434\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 824us/step - loss: 0.9429 - val_loss: 0.8642\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 795us/step - loss: 0.8698 - val_loss: 0.8096\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 786us/step - loss: 0.8197 - val_loss: 0.7719\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 770us/step - loss: 0.7853 - val_loss: 0.7457\n",
      "121/121 [==============================] - 0s 466us/step\n",
      "[CV] END learning_rate=0.0006344564654937622, n_hidden=1, n_neurons=3; total time=   2.2s\n",
      "Epoch 1/10\n",
      "242/242 [==============================] - 0s 1ms/step - loss: 5.8570 - val_loss: 3.7529\n",
      "Epoch 2/10\n",
      "242/242 [==============================] - 0s 790us/step - loss: 3.2465 - val_loss: 2.6369\n",
      "Epoch 3/10\n",
      "242/242 [==============================] - 0s 832us/step - loss: 2.4541 - val_loss: 2.0674\n",
      "Epoch 4/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 1.9845 - val_loss: 1.6904\n",
      "Epoch 5/10\n",
      "242/242 [==============================] - 0s 857us/step - loss: 1.6501 - val_loss: 1.4074\n",
      "Epoch 6/10\n",
      "242/242 [==============================] - 0s 815us/step - loss: 1.3983 - val_loss: 1.1990\n",
      "Epoch 7/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 1.2072 - val_loss: 1.0388\n",
      "Epoch 8/10\n",
      "242/242 [==============================] - 0s 799us/step - loss: 1.0583 - val_loss: 0.9182\n",
      "Epoch 9/10\n",
      "242/242 [==============================] - 0s 803us/step - loss: 0.9483 - val_loss: 0.8336\n",
      "Epoch 10/10\n",
      "242/242 [==============================] - 0s 828us/step - loss: 0.8708 - val_loss: 0.7767\n",
      "121/121 [==============================] - 0s 432us/step\n",
      "[CV] END learning_rate=0.0006344564654937622, n_hidden=1, n_neurons=3; total time=   2.3s\n",
      "Epoch 1/10\n",
      "363/363 [==============================] - 0s 849us/step - loss: 3.4449 - val_loss: 1.1815\n",
      "Epoch 2/10\n",
      "363/363 [==============================] - 0s 689us/step - loss: 0.8531 - val_loss: 0.6140\n",
      "Epoch 3/10\n",
      "363/363 [==============================] - 0s 703us/step - loss: 0.6168 - val_loss: 0.5481\n",
      "Epoch 4/10\n",
      "363/363 [==============================] - 0s 686us/step - loss: 0.5819 - val_loss: 0.5341\n",
      "Epoch 5/10\n",
      "363/363 [==============================] - 0s 670us/step - loss: 0.5740 - val_loss: 0.5290\n",
      "Epoch 6/10\n",
      "363/363 [==============================] - 0s 680us/step - loss: 0.5680 - val_loss: 0.5244\n",
      "Epoch 7/10\n",
      "363/363 [==============================] - 0s 681us/step - loss: 0.5657 - val_loss: 0.5215\n",
      "Epoch 8/10\n",
      "363/363 [==============================] - 0s 711us/step - loss: 0.5595 - val_loss: 0.5191\n",
      "Epoch 9/10\n",
      "363/363 [==============================] - 0s 672us/step - loss: 0.5577 - val_loss: 0.5159\n",
      "Epoch 10/10\n",
      "363/363 [==============================] - 0s 669us/step - loss: 0.5570 - val_loss: 0.5148\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "RandomizedSearchCV(cv=3,\n",
       "                   estimator=KerasRegressor(learning_rate=0.01, model=<function build_model at 0x000002B68704B670>, n_hidden=1, n_neurons=1),\n",
       "                   param_distributions={'learning_rate': [0.0003885626779073971,\n",
       "                                                          0.003097032220712561,\n",
       "                                                          0.0017385239188414362,\n",
       "                                                          0.002678976859111158,\n",
       "                                                          0.0006344564654937622],\n",
       "                                        'n_hidden': [0, 1, 2],\n",
       "                                        'n_neurons': [1, 2, 3, 4]},\n",
       "                   verbose=2)"
      ]
     },
     "execution_count": 262,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.fit(x_train, y_train, epochs=10,\n",
    "                  validation_data=(x_valid, y_valid),\n",
    "                  callbacks=[keras.callbacks.EarlyStopping(patience=10)])\n",
    "# 要搜索相当多的参数组合，谨慎运行"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 263,
   "id": "9933b8af-3dcb-4ca4-8bf5-35a77179b3d4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'n_neurons': 3, 'n_hidden': 0, 'learning_rate': 0.0017385239188414362}"
      ]
     },
     "execution_count": 263,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_params_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 264,
   "id": "e3c18c7d-cf92-42e4-8ca1-3ea5caebb7bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5464287929834919"
      ]
     },
     "execution_count": 264,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 265,
   "id": "093bb416-3b91-422f-b76b-5bd0a04789bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KerasRegressor(\n",
       "\tmodel=<function build_model at 0x000002B68704B670>\n",
       "\tbuild_fn=None\n",
       "\twarm_start=False\n",
       "\trandom_state=None\n",
       "\toptimizer=rmsprop\n",
       "\tloss=None\n",
       "\tmetrics=None\n",
       "\tbatch_size=None\n",
       "\tvalidation_batch_size=None\n",
       "\tverbose=1\n",
       "\tcallbacks=None\n",
       "\tvalidation_split=0.0\n",
       "\tshuffle=True\n",
       "\trun_eagerly=False\n",
       "\tepochs=1\n",
       "\tn_neurons=3\n",
       "\tn_hidden=0\n",
       "\tlearning_rate=0.0017385239188414362\n",
       ")"
      ]
     },
     "execution_count": 265,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 266,
   "id": "637b2da1-167e-4a01-ab87-71a8b371ed98",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "162/162 [==============================] - 0s 459us/step\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0.6149956528613277"
      ]
     },
     "execution_count": 266,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rnd_search_cv.score(x_test, y_test)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "69472ff4-0c93-4ab2-be9b-d5bd9bf461b1",
   "metadata": {},
   "source": [
    "此时的`model`不是`tensorflow`模型，可能与`scikeras`有关，因此不再有`evaluate`方法，`score`方法返回的值即可参考"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 269,
   "id": "6a76854f-6e82-4f93-b19e-540e03b96c86",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "KerasRegressor(\n",
       "\tmodel=<function build_model at 0x000002B68704B670>\n",
       "\tbuild_fn=None\n",
       "\twarm_start=False\n",
       "\trandom_state=None\n",
       "\toptimizer=rmsprop\n",
       "\tloss=None\n",
       "\tmetrics=None\n",
       "\tbatch_size=None\n",
       "\tvalidation_batch_size=None\n",
       "\tverbose=1\n",
       "\tcallbacks=None\n",
       "\tvalidation_split=0.0\n",
       "\tshuffle=True\n",
       "\trun_eagerly=False\n",
       "\tepochs=1\n",
       "\tn_neurons=3\n",
       "\tn_hidden=0\n",
       "\tlearning_rate=0.0017385239188414362\n",
       ")"
      ]
     },
     "execution_count": 269,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = rnd_search_cv.best_estimator_\n",
    "model"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a13c8ef0-d18b-491b-86ef-13d84475df8b",
   "metadata": {},
   "source": [
    "## 其他超参数"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d8c8f9ce-4496-4729-9fa8-78bbd78ab0c2",
   "metadata": {},
   "source": [
    "1. 隐藏层数量：对于简单问题，从一两个隐藏层开始\n",
    "2. 每个隐藏层的神经元数量：第一层的大于其他层的神经元数量，有时候是有帮助的\n",
    "3. 学习率：一般最佳学习率约为最大学习率的一半，如果作学习率和损失的图像，最佳学习率在损失率刚刚开始回升的学习率的下方（低约10倍）\n",
    "4. 优化器：除了SGD，还可以尝试其他优化器\n",
    "5. 批量大小：一种策略是尝试使用大批量处理，慢慢最佳学习率，如果训练不稳定或结果不佳，再尝试小批量处理，一般默认为32个一组处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0b19a429",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e6998630",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "255.675px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  },
  "toc-autonumbering": true,
  "toc-showcode": false,
  "toc-showmarkdowntxt": false,
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  },
  "widgets": {
   "application/vnd.jupyter.widget-state+json": {
    "state": {},
    "version_major": 2,
    "version_minor": 0
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
